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

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

Оглавление

Релиз ClickHouse v23.12, 2023-12-28
Релиз ClickHouse v23.11, 2023-12-06
Релиз ClickHouse v23.10, 2023-11-02
Релиз ClickHouse v23.9, 2023-09-28
Релиз ClickHouse v23.8 LTS, 2023-08-31
Релиз ClickHouse v23.7, 2023-07-27
Релиз ClickHouse v23.6, 2023-06-30
Релиз ClickHouse v23.5, 2023-06-08
Релиз ClickHouse v23.4, 2023-04-26
Релиз ClickHouse v23.3 LTS, 2023-03-30
Релиз ClickHouse v23.2, 2023-02-23
Релиз ClickHouse v23.1, 2023-01-25
Журнал изменений за 2022 год

Релиз ClickHouse 23.12 от 2023-12-28

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

  • Исправлена проверка на недетерминированные функции в выражениях TTL. Ранее в некоторых случаях можно было создать выражение TTL с недетерминированными функциями, что могло приводить к неопределённому поведению в дальнейшем. Это исправляет #37250. По умолчанию запрещены выражения TTL, которые не зависят ни от каких столбцов таблицы. Их можно снова разрешить с помощью SET allow_suspicious_ttl_expressions = 1 или SET compatibility = '23.11'. Закрывает #37286. #51858 (Alexey Milovidov).
  • Параметр MergeTree clean_deleted_rows объявлен устаревшим, он больше ни на что не влияет. Ключевое слово CLEANUP для OPTIMIZE по умолчанию не допускается (его можно разблокировать с помощью параметра allow_experimental_replacing_merge_with_cleanup). #58267 (Alexander Tokmakov). Это исправляет #57930. Это закрывает #54988. Это закрывает #54570. Это закрывает #50346. Это закрывает #47579. Функциональность должна быть удалена, потому что она оказалась неудачной. Мы должны удалить её как можно скорее, потому что у нас нет другого выхода. #57932 (Alexey Milovidov).

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

  • Реализована поддержка refreshable materialized views, запрошенных в #33919. #56946 (Michael Kolupaev, Michael Guzov).
  • Добавлен PASTE JOIN, который позволяет соединять таблицы без указания условия ON, просто по номерам строк. Пример: SELECT * FROM (SELECT number AS a FROM numbers(2)) AS t1 PASTE JOIN (SELECT number AS a FROM numbers(2) ORDER BY a DESC) AS t2. #57995 (Yarik Briukhovetskyi).
  • Оператор ORDER BY теперь поддерживает указание значения ALL, что означает, что ClickHouse сортирует по всем столбцам, указанным в операторе SELECT. Пример: SELECT col1, col2 FROM tab WHERE [...] ORDER BY ALL. #57875 (zhongyuankai).
  • Добавлена новая команда мутации ALTER TABLE <table> APPLY DELETED MASK, которая позволяет принудительно применить маску, записанную с помощью механизма легковесного удаления, и удалить с диска строки, помеченные как удалённые. #57433 (Anton Popov).
  • Обработчик /binary открывает визуальный интерфейс для просмотра символов в бинарнике ClickHouse. #58211 (Alexey Milovidov).
  • Добавлена новая SQL‑функция sqid для генерации идентификаторов Sqid (https://sqids.org/), пример: SELECT sqid(125, 126). #57512 (Robert Schulze).
  • Добавлена новая функция seriesPeriodDetectFFT для обнаружения периода временного ряда с использованием FFT. #57574 (Bhavna Jindal).
  • Добавлен HTTP-эндпоинт для проверки готовности Keeper к приёму трафика. #55876 (Konstantin Bogdanov).
  • Добавлен режим 'union' для определения схемы. В этом режиме результирующая схема таблицы представляет собой объединение схем всех файлов (то есть схема определяется по каждому файлу). Режим определения схемы управляется настройкой schema_inference_mode с двумя возможными значениями — default и union. Закрывает #55428. #55892 (Kruglov Pavel).
  • Добавлена новая настройка input_format_csv_try_infer_numbers_from_strings, которая позволяет определять числовые значения по строкам в формате CSV. Закрывает #56455. #56859 (Kruglov Pavel).
  • Если количество баз данных или таблиц превышает настраиваемый порог, отображается предупреждение для пользователя. #57375 (凌涛).
  • Словарь с макетом HASHED_ARRAYCOMPLEX_KEY_HASHED_ARRAY) поддерживает параметр SHARDS так же, как и макет HASHED. #57544 (vdimir).
  • Добавлены асинхронные метрики для общего объёма байт первичного ключа и общего объёма байт первичного ключа, выделенных в памяти. #57551 (Bharat Nallan).
  • Добавлена функция SHA512_256. #57645 (Bharat Nallan).
  • Добавлен алиас FORMAT_BYTES для formatReadableSize. #57592 (Bharat Nallan).
  • Разрешена возможность передавать необязательный токен сессии в табличную функцию s3. #57850 (Shani Elharrar).
  • Добавлена новая настройка http_make_head_request. Если она отключена, табличный движок URL не будет выполнять запрос HEAD для определения размера файла. Это нужно для поддержки неэффективных, неправильно сконфигурированных или не поддерживающих такую возможность HTTP-серверов. #54602 (Fionera).
  • Теперь можно ссылаться на столбец-алиас (ALIAS) в определениях индексов, не являющихся первичным ключом (issue #55650). Пример: CREATE TABLE tab(col UInt32, col_alias ALIAS col + 1, INDEX idx (col_alias) TYPE minmax) ENGINE = MergeTree ORDER BY col;. #57546 (Robert Schulze).
  • Добавлена новая настройка readonly, которую можно использовать для указания, что диск S3 доступен только для чтения. Это может быть полезно для создания таблицы на диске типа s3_plain при наличии доступа только на чтение к лежащему в основе бакету S3. #57977 (Pengyuan Bian).
  • Анализ первичного ключа в таблицах MergeTree теперь применяется к предикатам, которые включают виртуальный столбец _part_offset (при необходимости совместно с _part). Эта возможность может использоваться как особый вид вторичного индекса. #58224 (Amos Bird).

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

  • Извлекаются диапазоны непересекающихся частей из таблицы MergeTree во время обработки FINAL. Таким образом можно избежать дополнительной логики FINAL для этих непересекающихся диапазонов частей. Если количество дублирующихся значений с одинаковым первичным ключом невелико, производительность будет почти такой же, как без FINAL. Улучшена производительность чтения для MergeTree FINAL, когда включена настройка do_not_merge_across_partitions_select_final. #58120 (Maksim Kita).
  • Реализовано копирование между S3-дисками с использованием s3-server-side copy вместо копирования через буфер. Улучшены операции BACKUP/RESTORE и команда clickhouse-disks copy. #56744 (MikhailBurdukov).
  • Hash JOIN учитывает настройку max_joined_block_size_rows и не создаёт большие блоки для ALL JOIN. #56996 (vdimir).
  • Более раннее освобождение памяти при агрегации. Это может позволить избежать ненужной внешней агрегации. #57691 (Nikolai Kochetov).
  • Повышена производительность сериализации строк. #57717 (Maksim Kita).
  • Добавлена поддержка тривиальной оптимизации count для таблиц с движком Merge. #57867 (skyoct).
  • Оптимизирована агрегация в некоторых случаях. #57872 (Anton Popov).
  • Функция hasAny теперь может использовать преимущества полнотекстовых индексов пропуска. #57878 (Jpnock).
  • Функция if(cond, then, else) (и её псевдоним cond ? then : else) была оптимизирована для безветвленного вычисления. #57885 (zhanglistar).
  • MergeTree автоматически определяет значение настройки do_not_merge_across_partitions_select_final, если выражение ключа партиции содержит только столбцы из выражения первичного ключа. #58218 (Maksim Kita).
  • Ускорена работа операций MIN и MAX для нативных типов данных. #58231 (Raúl Marín).
  • Реализована политика кэширования SLRU для кэша файловой системы. #57076 (Kseniia Sumarokova).
  • Лимит числа подключений на один endpoint для фоновых выборок увеличен с 15 до значения настройки background_fetches_pool_size. - Настройка уровня MergeTree replicated_max_parallel_fetches_for_host признана устаревшей. - Настройки уровня MergeTree replicated_fetches_http_connection_timeout, replicated_fetches_http_send_timeout и replicated_fetches_http_receive_timeout перенесены на уровень Server. - Настройка keep_alive_timeout добавлена в список настроек уровня Server. #57523 (Nikita Mikhaylov).
  • Запросы к system.filesystem_cache стали менее затратными по памяти. #57687 (Kseniia Sumarokova).
  • Снижено использование памяти при десериализации строк. #57787 (Maksim Kita).
  • Более эффективный конструктор для Enum — актуально, когда у Enum очень много значений. #57887 (Duc Canh Le).
  • Улучшено чтение из кэша файловой системы: всегда используется метод pread. #57970 (Nikita Taranov).
  • Добавлена оптимизация цепочки AND notEquals в оптимизаторе логических выражений. Эта оптимизация доступна только при включённом экспериментальном Analyzer. #58214 (Kevin Mingtarja).

Улучшения

  • Поддержка мягкого ограничения памяти в Keeper. Он будет отклонять запросы, когда использование памяти приближается к максимальному значению. #57271 (Han Fei). #57699 (Han Fei).
  • Обеспечена корректная обработка обновлённой конфигурации кластера при вставках в distributed таблицы. При динамическом обновлении списка узлов кластера Directory Monitor distributed таблицы будет синхронизировать его. #42826 (zhongyuankai).
  • Не допускается создание реплицируемой таблицы с несогласованными параметрами слияния. #56833 (Duc Canh Le).
  • Отображать несжатый размер в system.tables. #56618. #57186 (Chen Lixiang).
  • Добавлена настройка skip_unavailable_shards для таблиц Distributed, аналогичная одноимённой настройке на уровне запроса. Закрывает #43666. #57218 (Gagan Goel).
  • Функция substring (синонимы: substr, mid) теперь может использоваться с типами Enum. Ранее первый аргумент функции должен был иметь тип String или FixedString. Это улучшает совместимость с инструментами третьих сторон, такими как Tableau, при использовании интерфейса MySQL. #57277 (Serge Klochkov).
  • Функция format теперь поддерживает произвольные типы аргументов (вместо того чтобы работать только с аргументами типов String и FixedString). Это позволяет выполнить запрос SELECT format('The {0} to all questions is {1}', 'answer', 42). #57549 (Robert Schulze).
  • Добавлена возможность использовать функцию date_trunc с нечувствительным к регистру первым аргументом. Теперь поддерживаются оба варианта: SELECT date_trunc('day', now()) и SELECT date_trunc('DAY', now()). #57624 (Yarik Briukhovetskyi).
  • Более информативные подсказки, когда таблица не существует. #57342 (Bharat Nallan).
  • Разрешено переопределять серверные настройки max_partition_size_to_drop и max_table_size_to_drop при выполнении запроса. #57452 (Jordi Villar).
  • Незначительно улучшено определение безымянных кортежей в форматах JSON. #57751 (Kruglov Pavel).
  • Добавлена поддержка флага read-only при подключении к Keeper (исправляет #53749). #57479 (Mikhail Koviazin).
  • Исправлены возможные случаи, когда распределённые отправки «застревали» из‑за ошибки «No such file or directory» (во время восстановления батча с диска). Исправлены возможные проблемы со значением error_count из system.distribution_queue (в случае, если distributed_directory_monitor_max_sleep_time_ms > 5 минут). Добавлено событие профилирования для отслеживания неуспешных асинхронных INSERT — DistributedAsyncInsertionFailures. #57480 (Azat Khuzhin).
  • Добавлена поддержка генерируемых столбцов PostgreSQL и значений по умолчанию для столбцов в MaterializedPostgreSQL (экспериментальная возможность). Закрывает #40449. #57568 (Kseniia Sumarokova).
  • Позволяет применять некоторые изменения настроек кэша файловой системы без перезапуска сервера. #57578 (Kseniia Sumarokova).
  • Корректная обработка структуры таблицы PostgreSQL при пустом массиве. #57618 (Mike Kot).
  • Добавлена метрика ClickHouseErrorMetric_ALL, отображающая общее количество ошибок, произошедших с момента последнего перезапуска сервера. #57627 (Nikita Mikhaylov).
  • Разрешены узлы в конфигурационном файле со ссылкой from_env/from_zk и непустым элементом при replace=1. #57628 (Azat Khuzhin).
  • Табличная функция fuzzJSON, которая позволяет генерировать большое количество некорректного JSON для фаззинга. #57646 (Julia Kartseva).
  • Разрешено преобразование IPv6 в UInt128 и бинарные арифметические операции. #57707 (Yakov Olkhovskiy).
  • Добавлена настройка async inserts deduplication cache, задающая время ожидания обновления кэша. Настройка async_block_ids_cache_min_update_interval_ms объявлена устаревшей. Теперь кэш обновляется только в случае конфликтов. #57743 (alesapin).
  • Функция sleep() теперь может быть прервана командой KILL QUERY. #57746 (Vitaly Baranov).
  • Запрещено выполнение запросов CREATE TABLE ... AS SELECT для движков таблиц Replicated в экспериментальной базе данных Replicated, поскольку они не поддерживаются. См. #35408. #57796 (Nikolay Degterinsky).
  • Исправлена и улучшена трансформация запросов для внешних баз данных, чтобы рекурсивно получать все совместимые предикаты. #57888 (flynn).
  • Добавлена поддержка динамического изменения размера файлового кеша. Закрывает #57866. #57897 (Kseniia Sumarokova).
  • Обеспечена корректная поддержка system.stack_trace для потоков с заблокированным SIGRTMIN (такие потоки могут встречаться во внешних библиотеках низкого качества, таких как Apache rdkafka). #57907 (Azat Khuzhin). А также сигнал отправляется потокам только в том случае, если он не заблокирован, чтобы избежать ожидания storage_system_stack_trace_pipe_read_timeout_ms, когда в этом нет смысла. #58136 (Azat Khuzhin).
  • Разрешить сбои Keeper при проверке вставок с кворумом. #57986 (Raúl Marín).
  • Добавлено максимальное/пиковое значение RSS (MemoryResidentMax) в таблицу system.asynchronous_metrics. #58095 (Azat Khuzhin).
  • Этот PR позволяет использовать ссылки в стиле S3 (https:// и s3://) без указания региона, даже если он отличается от региона по умолчанию. Кроме того, автоматически определяется корректный регион, если пользователь указал неверный. #58148 (Yarik Briukhovetskyi).
  • clickhouse-format --obfuscate будет корректно обрабатывать Settings, MergeTreeSettings и часовые пояса и не изменять их названия. #58179 (Alexey Milovidov).
  • Добавлена явная функция finalize() в ZipArchiveWriter. Упрощён слишком сложный код в ZipArchiveWriter. Это исправляет #58074. #58202 (Vitaly Baranov).
  • Кэши с одинаковым путём теперь используют одни и те же объекты кэша. Такое поведение было и раньше, но было нарушено в версии 23.4. Если для таких кэшей с одинаковым путём заданы разные наборы настроек кэша, будет выброшено исключение, сообщающее, что это не допускается. #58264 (Kseniia Sumarokova).
  • Параллельные реплики (экспериментальная функция): более удобные настройки #57542 (Igor Nikonov).
  • Parallel replicas (экспериментальная возможность): улучшена обработка ответов на объявления #57749 (Igor Nikonov).
  • Параллельные реплики (экспериментальная функция): строже учитывать min_number_of_marks в ParallelReplicasReadingCoordinator #57763 (Nikita Taranov).
  • Параллельные реплики (экспериментальная возможность): отключены параллельные реплики для IN (subquery) #58133 (Igor Nikonov).
  • Параллельные реплики (экспериментальная возможность): добавлено событие профиля 'ParallelReplicasUsedCount' #58173 (Igor Nikonov).
  • Запросы, отличные от POST, такие как HEAD, будут только для чтения, аналогично GET. #58060 (San).
  • Добавлен столбец bytes_uncompressed в таблицу system.part_log #58167 (Jordi Villar).
  • Добавлено имя базового бэкапа в таблицы system.backups и system.backup_log #58178 (Pradeep Chhetri).
  • Добавлена поддержка задания параметров запроса в clickhouse-local через командную строку #58210 (Pradeep Chhetri).

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

  • Рандомизировать больше настроек #39663 (Anton Popov).
  • Рандомизировать отключённые оптимизации в CI #57315 (Raúl Marín).
  • Разрешить использование табличных движков и функций, связанных с Azure, на macOS. #51866 (Alexey Milovidov).
  • ClickHouse Fast Test теперь использует Musl вместо GLibc. #57711 (Alexey Milovidov). Полностью статическая сборка на Musl доступна для загрузки из CI.
  • Запускать ClickBench для каждого коммита. Это закрывает #57708. #57712 (Alexey Milovidov).
  • Исключить использование небезопасной C/POSIX-функции select во внешних библиотеках. #57467 (Igor Nikonov).
  • Настройки, доступные только в ClickHouse Cloud, также будут присутствовать в open-source сборке ClickHouse для удобства. #57638 (Nikita Mikhaylov).

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

  • Исправлена возможная проблема с нарушением порядка сортировки в TTL GROUP BY #49103 (Nikita Mikhaylov).
  • Исправлено: в стратегии разбиения на бакеты lttb первый и последний бакеты теперь содержат только по одной точке #57003 (FFish).
  • Исправлена потенциальная взаимоблокировка в формате Template при синхронизации после ошибки #57004 (Kruglov Pavel).
  • Исправлена ошибка, приводившая к преждевременной остановке разбора файла при пропуске большого количества ошибок #57006 (Kruglov Pavel).
  • Предотвращён обход ACL словаря через табличную функцию dictionary #57362 (Salvatore Mesoraca).
  • Исправлен ещё один случай ошибки «non-ready Set», обнаруженной фаззером. #57423 (Nikolai Kochetov).
  • Исправлено несколько ошибок в использовании функции PostgreSQL array_ndims. #57436 (Ryan Jacobs).
  • Исправлена несогласованность RWLock после истечения тайм‑аута блокировки на запись #57454 (Vitaly Baranov). Исправлена несогласованность RWLock после истечения тайм‑аута блокировки на запись (снова) #57733 (Vitaly Baranov).
  • Исправлено: не исключать эфемерный столбец при построении цепочки проталкивания в представления #57461 (Yakov Olkhovskiy).
  • MaterializedPostgreSQL (экспериментальная функциональность): исправлена ошибка #41922, добавлен тест для #41923 #57515 (Kseniia Sumarokova).
  • Игнорировать предложение ON CLUSTER в запросах GRANT/REVOKE для управления реплицируемыми сущностями доступа. #57538 (MikhailBurdukov).
  • Исправлено падение clickhouse-local #57553 (Nikolay Degterinsky).
  • Исправлена ошибка в Hash JOIN. #57564 (vdimir).
  • Исправлена потенциальная ошибка в источнике PostgreSQL #57567 (Kseniia Sumarokova).
  • Исправлено приведение типов в Hash JOIN для вложенного LowCardinality. #57614 (vdimir).
  • Предотвращены зависания system.stack_trace путём корректного запрета параллельного чтения из него. #57641 (Azat Khuzhin).
  • Исправлена ошибка при агрегации разреженных столбцов с any(...) RESPECT NULL #57710 (Azat Khuzhin).
  • Исправлен парсинг унарных операторов #57713 (Nikolay Degterinsky).
  • Исправлена загрузка зависимостей для экспериментального табличного движка MaterializedPostgreSQL. #57754 (Kseniia Sumarokova).
  • Исправлены повторные попытки выполнения для отключённых узлов при BACKUP/RESTORE ON CLUSTER #57764 (Vitaly Baranov).
  • Исправлен результат внешней агрегации при частично материализованной проекции #57790 (Anton Popov).
  • Исправлено слияние в агрегатных функциях с комбинатором *Map #57795 (Anton Popov).
  • Отключён system.kafka_consumers из-за ошибки. #57822 (Azat Khuzhin).
  • Исправлена поддержка ключей типа LowCardinality в Merge JOIN. #57827 (vdimir).
  • Исправление для InterpreterCreateQuery, связанное с примерным блоком. #57855 (Maksim Kita).
  • addresses_expr игнорировались в именованных коллекциях PostgreSQL. #57874 (joelynch).
  • Исправлен некорректный доступ к памяти в BLAKE3 (Rust) #57876 (Raúl Marín). Затем реализация была переписана с Rust на C++ для повышения безопасности работы с памятью. #57994 (Raúl Марин).
  • Нормализованы имена функций в CREATE INDEX #57906 (Alexander Tokmakov).
  • Исправлена обработка случая недоступности реплик до выполнения первого запроса #57933 (Nikita Taranov).
  • Исправлена некорректная классификация псевдонима литерала #57988 (Chen768959).
  • Исправлена некорректная предварительная обработка в Keeper #58069 (Antonio Andelic).
  • Исправлено целочисленное переполнение в библиотеке Poco, связанное с UTF32Encoding #58073 (Andrey Fedotov).
  • Исправлена работа параллельных реплик (экспериментальная функциональность) при наличии скалярного подзапроса с большим целочисленным значением #58118 (Alexey Milovidov).
  • Исправлена функция accurateCastOrNull для значений DateTime, выходящих за допустимый диапазон #58139 (Andrey Zvonov).
  • Исправлена возможная ошибка PARAMETER_OUT_OF_BOUND при чтении подстолбцов из широкой части в MergeTree #58175 (Kruglov Pavel).
  • Исправлено снижение производительности CREATE VIEW с огромным количеством подзапросов #58220 (Tao Wang).
  • Исправлен параллельный парсинг JSONCompactEachRow #58181 (Alexey Milovidov). #58250 (Kruglov Pavel).

Релиз ClickHouse 23.11 от 2023-12-06

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

  • В конфигурационном файле сервера ClickHouse по умолчанию включены access_management (управление пользователями с помощью SQL-запросов) и named_collection_control (управление именованными коллекциями с помощью SQL-запросов) для пользователя default. Это закрывает #56482. #56619 (Alexey Milovidov).
  • Многочисленные улучшения для RESPECT NULLS/IGNORE NULLS для оконных функций. Если вы используете их как агрегатные функции и храните состояния агрегатных функций с этими модификаторами, они могут стать несовместимыми. #57189 (Raúl Marín).
  • Удалена оптимизация optimize_move_functions_out_of_any. #57190 (Raúl Marín).
  • Спецификаторы формата %l/%k/%c в функции parseDateTime теперь могут разбирать часы/месяцы без ведущих нулей, например, select parseDateTime('2023-11-26 8:14', '%F %k:%i') теперь работает. Установите parsedatetime_parse_without_leading_zeros = 0, чтобы восстановить предыдущее поведение, требовавшее две цифры. Функция formatDateTime теперь также может выводить часы/месяцы без ведущих нулей. Это контролируется настройкой formatdatetime_format_without_leading_zeros, но по умолчанию она выключена, чтобы не ломать существующие сценарии использования. #55872 (Azat Khuzhin).
  • Больше нельзя использовать агрегатную функцию avgWeighted с аргументами типа Decimal. Обходной путь: преобразовать аргументы в Float64. Это закрывает #43928. Это закрывает #31768. Это закрывает #56435. Если вы использовали эту функцию внутри materialized views или проекций с аргументами типа Decimal, свяжитесь с [email protected]. Исправлена ошибка в агрегатной функции sumMap, из-за чего она стала работать медленнее примерно в 1,5–2 раза. Это не важно, потому что функция всё равно мусорная. Это закрывает #54955. Это закрывает #53134. Это закрывает #55148. Исправлена ошибка в функции groupArraySample — она использовала одно и то же случайное начальное значение (seed) в случае, когда в запросе генерировалось более одного агрегатного состояния. #56350 (Alexey Milovidov).

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

  • Добавлена серверная настройка async_load_databases для асинхронной загрузки баз данных и таблиц. Ускоряет запуск сервера. Применяется к базам данных с движками Ordinary, Atomic и Replicated. Метаданные их таблиц загружаются асинхронно. Запрос к таблице повышает приоритет задания загрузки и ждёт его завершения. Добавлена новая таблица system.asynchronous_loader для интроспекции. #49351 (Sergei Trifonov).
  • Добавлена системная таблица blob_storage_log. Она позволяет вести аудит всех данных, записанных в S3 и другие объектные хранилища. #52918 (vdimir).
  • Используйте статистику для более оптимального упорядочивания условий PREWHERE. #53240 (Han Fei).
  • Добавлена поддержка сжатия в протоколе Keeper. Ее можно включить на стороне ClickHouse с помощью флага use_compression в секции zookeeper. Учтите, что сжатие поддерживается только в ClickHouse Keeper, а Apache ZooKeeper его не поддерживает. Исправляет #49507. #54957 (SmitaRKulkarni).
  • Добавлен параметр storage_metadata_write_full_object_key. Если он имеет значение true, метаданные записываются в новом формате. В этом формате ClickHouse сохраняет полный ключ удалённого объекта в файле метаданных, что даёт большую гибкость и возможности для оптимизации. #55566 (Sema Checherinda).
  • Добавлены новые настройки и синтаксис, предотвращающие перезапись полей именованных коллекций. Это позволяет исключить получение злоумышленником несанкционированного доступа к секретам. #55782 (Salvatore Mesoraca).
  • Добавлен столбец hostname во все системные таблицы логов — он полезен, если вы используете реплицируемые, общие или распределённые системные таблицы. #55894 (Bharat Nallan).
  • Добавлен запрос CHECK ALL TABLES. #56022 (vdimir).
  • Добавлена функция fromDaysSinceYearZero, которая аналогична функции FROM_DAYS в MySQL. Например, SELECT fromDaysSinceYearZero(739136) возвращает 2023-09-08. #56088 (Joanna Hulboj).
  • Добавлен внешний инструмент на Python для просмотра бэкапов и извлечения из них информации без использования ClickHouse. #56268 (Vitaly Baranov).
  • Реализована новая настройка preferred_optimize_projection_name. Если она имеет непустое значение, по возможности будет использоваться указанная проекция вместо выбора из всех кандидатов. #56309 (Yarik Briukhovetskyi).
  • Добавлена 4-символьная команда для передачи / отказа от роли лидера (https://github.com/ClickHouse/ClickHouse/issues/56352). #56354 (Pradeep Chhetri). #56620 (Pradeep Chhetri).
  • Добавлена новая SQL-функция arrayRandomSample(arr, k), которая возвращает выборку k элементов из входного массива. Ранее аналогичную функциональность можно было реализовать только с использованием менее удобного синтаксиса, например SELECT arrayReduce('groupArraySample(3)', range(10)). #56416 (Robert Schulze).
  • Добавлена поддержка данных типа Float16 для использования в файлах .npy. Закрыта задача #56344. #56424 (Yarik Briukhovetskyi).
  • Добавлено системное представление information_schema.statistics для лучшей совместимости с Tableau Online. #56425 (Serge Klochkov).
  • Добавлена таблица system.symbols для интроспекции бинарника. #56548 (Alexey Milovidov).
  • Настраиваемые дашборды. Запросы для графиков теперь по умолчанию загружаются из новой таблицы system.dashboards. #56771 (Sergei Trifonov).
  • Добавлена табличная функция fileCluster — она полезна, если вы монтируете общую файловую систему (NFS и подобные) в каталог user_files. #56868 (Andrey Zvonov).
  • Добавлен виртуальный столбец _size, содержащий размер файла в байтах, для движков s3/file/hdfs/url/azureBlobStorage. #57126 (Kruglov Pavel).
  • Добавлена метрика Prometheus, показывающая количество ошибок для каждого кода ошибки, возникших на сервере с момента последнего перезапуска, через endpoint Prometheus. #57209 (Nikita Mikhaylov).
  • ClickHouse Keeper сообщает о зоне доступности, в которой он запущен, по пути /keeper/availability-zone. Её можно настроить с помощью <availability_zone><value>us-west-1a</value></availability_zone>. #56715 (Jianfei Hu).
  • Снять экспериментальный статус ALTER materialized_view MODIFY QUERY и объявить устаревшей настройку allow_experimental_alter_materialized_view_structure. Исправляет #15206. #57311 (alesapin).
  • Настройка join_algorithm теперь учитывает указанный порядок #51745 (vdimir).
  • Добавлена поддержка стандартных типов Protobuf в формате Protobuf. #56741 (János Benjamin Antal).

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

  • Адаптивные таймауты для взаимодействия с S3. Первая попытка выполняется с короткими таймаутами отправки и приёма данных. #56314 (Sema Checherinda).
  • Увеличено значение по умолчанию параметра max_concurrent_queries со 100 до 1000. Это имеет смысл, когда есть большое количество подключающихся клиентов, которые медленно отправляют или получают данные, так что производительность сервера не ограничивается CPU, или когда число ядер CPU превышает 100. Также по умолчанию включено управление параллелизмом, а общее желаемое количество потоков обработки запросов установлено равным удвоенному числу ядер CPU. Это улучшает производительность в сценариях с очень большим количеством одновременных запросов. #46927 (Alexey Milovidov).
  • Добавлена поддержка параллельного вычисления оконных функций. Исправлена #34688. #39631 (Dmitry Novik).
  • Движок таблицы Numbers (таблицы system.numbers) теперь анализирует условие запроса, чтобы сгенерировать нужное подмножество данных, аналогично индексу таблицы. #50909 (JackyWoo).
  • Повышена производительность фильтрации по условию IN (...) для движка таблицы Merge. #54905 (Nikita Taranov).
  • Улучшение, которое проявляется при полном кэше файловой системы и выполнении крупных операций чтения. #55158 (Kseniia Sumarokova).
  • Добавлена возможность отключать контрольные суммы для S3, чтобы избежать избыточных проходов по файлу (это поведение управляется настройкой s3_disable_checksum). #55559 (Azat Khuzhin).
  • Теперь мы синхронно читаем из удалённых таблиц, когда данные находятся в кэше страниц (как и для локальных таблиц). Это быстрее, не требует синхронизации внутри пула потоков, позволяет свободно выполнять операции seek по локальной файловой системе и сокращает время простоя CPU в ожидании. #55841 (Nikita Taranov).
  • Оптимизация получения значений из map, arrayElement. Это даст ускорение примерно на 30%: уменьшен объём зарезервированной памяти и сокращено число вызовов resize. #55957 (lgbo).
  • Оптимизация многоступенчатой фильтрации с использованием AVX-512. Результаты экспериментов производительности на наборе данных OnTime на устройстве ICX (процессор Intel Xeon Platinum 8380, 80 ядер, 160 потоков) показывают, что это изменение может дать прирост QPS запросов Q2, Q3, Q4, Q5 и Q6 на 7.4%, 5.9%, 4.7%, 3.0% и 4.6% соответственно, без влияния на остальные запросы. #56079 (Zhiguo Zhou).
  • Ограничено максимальное количество потоков, участвующих в профилировании запросов. Если потоков больше — они пропускают профилирование. #56105 (Alexey Milovidov).
  • Снижено количество вызовов виртуальных функций в оконных функциях. #56120 (Maksim Kita).
  • Добавлена поддержка рекурсивного отсечения полей Tuple в формате ORC для ускорения сканирования. #56122 (李扬).
  • Простая оптимизация подсчёта для формата данных Npy: запросы вида select count() from 'data.npy' будут выполняться значительно быстрее за счёт кэширования результатов. #56304 (Yarik Briukhovetskyi).
  • Запросы с агрегацией и большим количеством потоков будут использовать меньше памяти при построении плана выполнения. #57074 (Alexey Milovidov).
  • Повышена производительность выполнения запросов для сценариев с большим числом пользователей и высокой конкурентностью запросов (>2000 QPS) за счёт оптимизации доступа к ProcessList. #57106 (Andrej Hoos).
  • Незначительное улучшение ARRAY JOIN: повторное использование промежуточных результатов. #57183 (李扬).
  • Бывали случаи, когда раскрутка стека выполнялась медленно. Больше нет. #57221 (Alexey Milovidov).
  • Теперь при чтении из внешнего хранилища при max_streams = 1 используется пул чтения по умолчанию. Это особенно полезно, когда включена упреждающая выборка данных (prefetch). #57334 (Nikita Taranov).
  • Улучшение Keeper: снижено потребление памяти при запуске за счёт отложенной предварительной обработки журналов. #55660 (Antonio Andelic).
  • Улучшена производительность сопоставления по маскам (glob) для хранилищ File и HDFS. #56141 (Andrey Zvonov).
  • Списки постинга в экспериментальных полнотекстовых индексах теперь хранятся в сжатом виде, что уменьшает их размер на 10–30%. #56226 (Harry Lee).
  • Параллелизована работа BackupEntriesCollector при создании резервных копий. #56312 (Kseniia Sumarokova).

Улучшения

  • Добавлена новая настройка MergeTree add_implicit_sign_column_constraint_for_collapsing_engine (по умолчанию отключена). При включении она добавляет неявное ограничение CHECK для таблиц CollapsingMergeTree, которое ограничивает значение столбца Sign значениями -1 и 1. #56701. #56986 (Kevin Mingtarja).
  • Разрешено добавлять новые диски в конфигурацию хранилища без перезапуска. #56367 (Duc Canh Le).
  • Добавлена поддержка создания и материализации индекса в одном и том же запросе ALTER, а также возможности указывать modify TTL и materialize TTL в одном запросе. Закрывает #55651. #56331 (flynn).
  • Добавлена новая табличная функция fuzzJSON, возвращающая строки с модифицированными версиями исходной JSON-строки со случайными вариациями. #56490 (Julia Kartseva).
  • Движок Merge фильтрует записи в соответствии с политиками строк исходных таблиц, поэтому нет необходимости создавать отдельную политику строк для таблицы Merge. #50209 (Ilya Golshtein).
  • Добавлена настройка max_execution_time_leaf для ограничения времени выполнения на сегменте при распределённом запросе и timeout_overflow_mode_leaf для управления поведением при срабатывании тайм-аута. #51823 (Duc Canh Le).
  • Добавлена настройка ClickHouse, позволяющая отключить туннелирование HTTPS‑запросов через HTTP‑прокси. #55033 (Arthur Passos).
  • Параметр background_fetches_pool_size установлен в 16, а background_schedule_pool_size — в 512; такая конфигурация лучше подходит для эксплуатации в продакшене с частыми небольшими вставками. #54327 (Denny Crane).
  • При чтении данных из файла в формате CSV, если в конце строки стоит \r, за которым не следует \n, возникает исключение вида: Cannot parse CSV format: found \r (CR) not followed by \n (LF). Line must end by \n (LF) or \r\n (CR LF) or \n\r. В ClickHouse конец строки в CSV должен быть \n или \r\n или \n\r, поэтому символ \r должен сопровождаться \n, но в некоторых случаях входные CSV-данные могут быть некорректными, как в примере выше, когда \r стоит в конце строки. #54340 (KevinyhZou).
  • Библиотека Arrow обновлена до релиза 13.0.0 с поддержкой новых кодировок. Закрыта задача #44505. #54800 (Kruglov Pavel).
  • Улучшена производительность запросов ON CLUSTER за счет удаления ресурсоемких системных вызовов для получения всех сетевых интерфейсов при поиске локального IP-адреса в списке хостов в записи DDL. #54909 (Duc Canh Le).
  • Исправлен учет памяти, выделенной до привязки потока к запросу или пользователю. #56089 (Nikita Taranov).
  • Добавлена поддержка LARGE_LIST в форматах Apache Arrow. #56118 (edef).
  • Добавлена возможность ручной компакции EmbeddedRocksDB с помощью запроса OPTIMIZE. #56225 (Azat Khuzhin).
  • Добавлена возможность задавать BlockBasedTableOptions для таблиц EmbeddedRocksDB. #56264 (Azat Khuzhin).
  • SHOW COLUMNS теперь отображает эквивалентное имя типа данных MySQL, если соединение установлено через протокол MySQL. Ранее так было только при установке use_mysql_types_in_show_columns = 1. Настройка сохранена, но помечена как устаревшая. #56277 (Robert Schulze).
  • Исправлена возможная ошибка The local set of parts of table doesn't look like the set of parts in ZooKeeper, возникавшая при перезапуске сервера сразу после выполнения TRUNCATE или DROP PARTITION. #56282 (Alexander Tokmakov).
  • Исправлена обработка неконстантных строк запросов в функциях formatQuery/formatQuerySingleLine. Также добавлены варианты обеих функций с суффиксом OrNull, которые возвращают NULL, если запрос не удаётся разобрать, вместо выбрасывания исключения. #56327 (Robert Schulze).
  • Добавлена возможность создания резервной копии materialized view с удалённой внутренней таблицей вместо завершения операции с ошибкой. #56387 (Kseniia Sumarokova).
  • Запросы к system.replicas инициируют обращения к ZooKeeper при выборке некоторых столбцов. Когда таблиц тысячи, эти обращения могут создавать значительную нагрузку на ZooKeeper. Если выполняется несколько одновременных запросов к system.replicas, они повторяют одни и те же обращения многократно. Изменение позволяет «дедуплицировать» обращения, выполняемые параллельными запросами. #56420 (Alexander Gololobov).
  • Исправлена трансляция в MySQL-совместимый запрос при обращении к внешним базам данных. #56456 (flynn).
  • Добавлена поддержка резервного копирования и восстановления таблиц с использованием движка KeeperMap. #56460 (Antonio Andelic).
  • Ответ 404 на CompleteMultipartUpload следует проверять повторно. Операция могла быть завершена на сервере, даже если клиент получил таймаут или другие сетевые ошибки. При следующей попытке CompleteMultipartUpload возвращается ответ 404. Если ключ объекта существует, эта операция считается успешной. #56475 (Sema Checherinda).
  • По умолчанию включён метод HTTP OPTIONS — это упрощает выполнение запросов к ClickHouse из веб-браузера. #56483 (Alexey Milovidov).
  • Значение параметра dns_max_consecutive_failures было по ошибке изменено в #46550 — это изменение отменено, а значение скорректировано на более подходящее. Также увеличен таймаут HTTP keep-alive до разумного значения, используемого в продакшене. #56485 (Alexey Milovidov).
  • Ленивая загрузка базовых бэкапов (базовый бэкап загружается только при необходимости). Также добавлены сообщения журнала и события профилирования для бэкапов. #56516 (Vitaly Baranov).
  • Параметр query_cache_store_results_of_queries_with_nondeterministic_functions (со значениями false или true) объявлен устаревшим. Его заменил параметр query_cache_nondeterministic_function_handling — перечисление (enum) с тремя значениями, которое определяет, как кэш запросов обрабатывает запросы с недетерминированными функциями: a) выбросить исключение (поведение по умолчанию), b) всё равно сохранить результат недетерминированного запроса или c) игнорировать, то есть не выбрасывать исключение и не кэшировать результат. #56519 (Robert Schulze).
  • Проверка на равенство в секции JOIN ON теперь переписывается в проверку is null. Экспериментальная возможность, только Analyzer. #56538 (vdimir).
  • Функция concat теперь поддерживает аргументы произвольных типов, а не только аргументы типов String и FixedString. Это делает её поведение более похожим на реализацию функции concat в MySQL. Например, SELECT concat('ab', 42) теперь возвращает ab42. #56540 (Serge Klochkov).
  • Добавлена возможность получения конфигурации кэша из секции 'named_collection' в конфигурации или из созданных через SQL именованных коллекций. #56541 (Kseniia Sumarokova).
  • PostgreSQL database engine: сделать удаление устаревших таблиц менее агрессивным в случае неуспешного подключения к PostgreSQL. #56609 (jsc0218).
  • Подключение к PostgreSQL занимало слишком много времени при неверно указанном URL, в результате соответствующий запрос зависал и затем отменялся. #56648 (jsc0218).
  • Улучшение Keeper: по умолчанию отключено сжатое логирование в Keeper. #56763 (Antonio Andelic).
  • Добавлена конфигурационная настройка wait_dictionaries_load_at_startup. #56782 (Vitaly Baranov).
  • В предыдущих версиях ClickHouse существовала потенциальная уязвимость: если пользователь подключался и безуспешно пытался аутентифицироваться с помощью метода «interserver secret», сервер не завершал соединение немедленно, а продолжал принимать и игнорировать оставшиеся пакеты от клиента. Хотя эти пакеты игнорируются, они всё равно разбираются, и если в них используется метод сжатия с другой известной уязвимостью, это приводит к эксплуатации этой уязвимости без аутентификации. Эта проблема была обнаружена в рамках ClickHouse Bug Bounty Program пользователем https://twitter.com/malacupa. #56794 (Alexey Milovidov).
  • Получение части ожидает, пока эта часть будет полностью зафиксирована на удалённой реплике. Не следует отправлять часть в состоянии PreActive. В случае zero copy это жёсткое требование. #56808 (Sema Checherinda).
  • Исправлена потенциальная ошибка преобразования логической репликации PostgreSQL при использовании экспериментального MaterializedPostgreSQL. #53721 (takakawa).
  • Реализована пользовательская настройка alter_move_to_space_execute_async, позволяющая выполнять запросы ALTER TABLE ... MOVE PARTITION|PART TO DISK|VOLUME асинхронно. Размер пула для фонового выполнения контролируется параметром background_move_pool_size. Поведение по умолчанию — синхронное выполнение. Исправлена #47643. #56809 (alesapin).
  • Добавлена возможность фильтровать по движку при сканировании system.tables, чтобы избежать лишних (потенциально затратных по времени) подключений. #56813 (jsc0218).
  • Добавлен вывод total_bytes и total_rows в системных таблицах для хранилища RocksDB. #56816 (Aleksandr Musorin).
  • Разрешить базовые команды ALTER для временных таблиц. #56892 (Sergey).
  • Сжатие LZ4. Буферизация сжатого блока в редких случаях, когда ёмкости выходного буфера недостаточно, чтобы записать его напрямую. #56938 (Sema Checherinda).
  • Добавлены метрики для числа заданий в очереди, что полезно для пула потоков ввода-вывода. #56958 (Alexey Milovidov).
  • Добавлена настройка движка таблиц PostgreSQL в конфигурационный файл. Добавлена проверка этой настройки. Добавлена документация по этой дополнительной настройке. #56959 (Peignon Melvyn).
  • Функцию concat теперь можно вызывать с одним аргументом, например SELECT concat('abc'). Это делает ее поведение более согласованным с реализацией функции concat в MySQL. #57000 (Serge Klochkov).
  • Подписывает все заголовки x-amz-*, как того требует документация AWS S3. #57001 (Arthur Passos).
  • Функцию fromDaysSinceYearZero (псевдоним: FROM_DAYS) теперь можно использовать со знаковыми и беззнаковыми целочисленными типами данных (ранее требовался беззнаковый целочисленный тип). Это повышает совместимость со сторонними инструментами, такими как Tableau Online. #57002 (Serge Klochkov).
  • Добавлен system.s3queue_log в конфигурацию по умолчанию. #57036 (Kseniia Sumarokova).
  • Измените значение по умолчанию для wait_dictionaries_load_at_startup на true и используйте эту настройку только если dictionaries_lazy_load имеет значение false. #57133 (Vitaly Baranov).
  • Проверять тип источника словаря при создании словаря, даже если dictionaries_lazy_load включен. #57134 (Vitaly Baranov).
  • Оптимизации на уровне плана теперь можно включать и отключать по отдельности. Ранее можно было только отключить их все разом. Настройка, которая ранее использовалась для этого (query_plan_enable_optimizations), сохранена и по‑прежнему может использоваться для отключения всех оптимизаций. #57152 (Robert Schulze).
  • Код завершения сервера будет соответствовать коду исключения. Например, если сервер не может запуститься из-за ограничения памяти, он завершится с кодом 241 = MEMORY_LIMIT_EXCEEDED. В предыдущих версиях код завершения для исключений всегда был 70 = Poco::Util::ExitCode::EXIT_SOFTWARE. #57153 (Alexey Milovidov).
  • Не выполнять деманглирование и символизацию кадров стека из заголовочного файла C++ functional. #57201 (Mike Kot).
  • Страница HTTP-сервера /dashboard теперь поддерживает многолинейные графики. #57236 (Sergei Trifonov).
  • Параметр командной строки max_memory_usage_in_client поддерживает строковое значение с суффиксом единицы измерения (K, M, G и т. д.). Закрывает задачу #56879. #57273 (Yarik Briukhovetskyi).
  • Обновлена Intel QPL (используется кодеком DEFLATE_QPL) с v1.2.0 до v1.3.1. Также исправлена ошибка для случая BOF (Block on Fault) = 0: теперь при возникновении ошибок страниц памяти (page faults) выполняется переход на программный (SW) путь. #57291 (jasperzhu).
  • Увеличено значение по умолчанию настройки replicated_deduplication_window в MergeTree со 100 до 1k. #57335 (sichenzhao).
  • Реже использовать INCONSISTENT_METADATA_FOR_BACKUP. По возможности лучше продолжать сканирование вместо его остановки и последующего запуска сканирования резервной копии с самого начала. #57385 (Vitaly Baranov).

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

  • Добавлен тест SQLLogic. #56078 (Han Fei).
  • Для удобства clickhouse-local и clickhouse-client доступны под короткими именами (ch, chl, chc). #56634 (Alexey Milovidov).
  • Дополнительно оптимизирован размер сборки за счёт удаления неиспользуемого кода из внешних библиотек. #56786 (Alexey Milovidov).
  • Добавлена автоматическая проверка на отсутствие слишком крупных единиц трансляции. #56559 (Alexey Milovidov).
  • Уменьшен размер однобинарного дистрибутива. Это закрывает #55181. #56617 (Alexey Milovidov).
  • Информация о размерах каждой единицы трансляции и бинарного файла после каждой сборки будет отправляться в CI-базу данных ClickHouse Cloud. Это закрывает #56107. #56636 (Alexey Milovidov).
  • Некоторые файлы библиотеки "Apache Arrow" (которую мы используем только для второстепенных задач, таких как разбор формата arrow) каждый раз пересобирались независимо от кэша сборки. Это исправлено. #56657 (Alexey Milovidov).
  • Исключена повторная компиляция единиц трансляции, зависящих от автогенерируемого исходного файла с информацией о версии. #56660 (Alexey Milovidov).
  • Трассировочные данные запусков компоновщика будут отправляться в CI-базу данных ClickHouse Cloud. #56725 (Alexey Milovidov).
  • Для исполняемого файла clickhouse используются отладочные символы DWARF 5 (ранее использовался DWARF 4). #56770 (Michael Kolupaev).
  • Добавлена новая опция сборки SANITIZE_COVERAGE. Если она включена, код инструментируется для отслеживания покрытия. Собранная информация доступна внутри ClickHouse с помощью: (1) новой функции coverage, которая возвращает массив уникальных адресов в коде, найденных после предыдущего сброса покрытия; (2) запроса SYSTEM RESET COVERAGE, который сбрасывает накопленные данные. Это позволяет сравнивать покрытие разных тестов, включая дифференциальное покрытие кода. Продолжение #20539. #56102 (Alexey Milovidov).
  • Некоторые фреймы стека могут не разрешаться при сборе стеков. В таких случаях может быть полезен сам адрес. #56267 (Alexander Gololobov).
  • Добавлена опция для отключения libssh. #56333 (Alexey Milovidov).
  • В S3-тестах в CI включён temporary_data_in_cache. #48425 (vdimir).
  • В CI установлено максимальное потребление памяти для clickhouse-client (1G). #56873 (Nikita Mikhaylov).

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

  • Исправлен экспериментальный Analyzer — при вставке из SELECT с подзапросом, ссылающимся на таблицу, в которую выполняется вставка, он должен обрабатывать только вставляемый блок. #50857 (Yakov Olkhovskiy).
  • Исправлена ошибка в функции str_to_map. #56423 (Arthur Passos).
  • Keeper reconfig: добавлен тайм-аут перед передачей/получением роли лидера #53481 (Mike Kot).
  • Исправлен некорректный заголовок в grace hash join и при проталкивании фильтра #53922 (vdimir).
  • Разрешён выбор из системных таблиц, когда таблица основана на табличной функции. #55540 (MikhailBurdukov).
  • RFC: Исправление ошибки «Cannot find column X in source stream» для распределённых запросов с LIMIT BY #55836 (Azat Khuzhin).
  • Исправлена ошибка «Cannot read from file:» при запуске клиента в фоновом режиме #55976 (Kruglov Pavel).
  • Исправлено аварийное завершение clickhouse-local при некорректном значении параметра send_logs_level #55994 (Kruglov Pavel).
  • Исправлена ошибка в EXPLAIN AST с параметризованным представлением #56004 (SmitaRKulkarni).
  • Исправлен сбой при загрузке таблицы во время запуска #56232 (Nikolay Degterinsky).
  • Исправлены словари с источником данных ClickHouse, использующие явный запрос #56236 (Nikolay Degterinsky).
  • Исправлен segfault в обработчике сигналов Keeper #56266 (Antonio Andelic).
  • Исправлена проблема с неполным результатом запроса при использовании UNION в функции view(). #56274 (Nikolai Kochetov).
  • Устранена несогласованность между "cast('0' as DateTime64(3))" и "cast('0' as Nullable(DateTime64(3)))" #56286 (李扬).
  • Исправлено редкое состояние гонки, связанное с ошибкой выделения памяти #56303 (alesapin).
  • Исправлена ошибка восстановления из резервной копии при использовании flatten_nested и data_type_default_nullable #56306 (Kseniia Sumarokova).
  • Исправлена ошибка, приводившая к сбою при добавлении столбца типа Object(JSON) #56307 (Nikita Mikhaylov).
  • Исправлено падение в filterPushDown #56380 (vdimir).
  • Исправлено восстановление из резервной копии при наличии материализованного представления и удалённой исходной таблицы #56383 (Kseniia Sumarokova).
  • Исправлен segfault во время инициализации Kerberos #56401 (Nikolay Degterinsky).
  • Исправлено переполнение буфера в T64 #56434 (Alexey Milovidov).
  • Исправлена работа Nullable первичного ключа в FINAL (2) #56452 (Amos Bird).
  • Исправлена ошибка в запросах ON CLUSTER без базы данных на инициирующем узле #56484 (Nikolay Degterinsky).
  • Исправлен сбой запуска из-за зависимости TTL #56489 (Nikolay Degterinsky).
  • Исправлена работа запросов ALTER COMMENT с ON CLUSTER #56491 (Nikolay Degterinsky).
  • Исправлена работа ALTER COLUMN с ALIAS #56493 (Nikolay Degterinsky).
  • Исправлена обработка пустых NAMED COLLECTIONs #56494 (Nikolay Degterinsky).
  • Исправлены две ошибки в анализе проекций. #56502 (Amos Bird).
  • Исправлена обработка алиасов в кэше запросов #56545 (Robert Schulze).
  • Исправлено преобразование из Nullable(Enum) в Nullable(String) #56644 (Nikolay Degterinsky).
  • Более надёжная обработка логов в Keeper #56670 (Antonio Andelic).
  • Исправлено слияние конфигурации для узлов с атрибутами подстановки #56694 (Konstantin Bogdanov).
  • Исправлено дублирующееся использование табличной функции input(). #56695 (Nikolai Kochetov).
  • Исправлена проблема с динамической загрузкой OpenSSL для RabbitMQ #56703 (Igor Nikonov).
  • Исправлено падение кодека GCD при наличии нулей в данных #56704 (Nikita Mikhaylov).
  • Исправлена ошибка 'mutex lock failed: Invalid argument' в clickhouse-local при вставке в функцию #56710 (Kruglov Pavel).
  • Исправлен разбор текстового представления Date в оптимистичном пути выполнения #56765 (Kruglov Pavel).
  • Исправлено аварийное завершение в кодеке FPC #56795 (Alexey Milovidov).
  • DatabaseReplicated: исправлен таймаут DDL-запроса после восстановления реплики #56796 (Alexander Tokmakov).
  • Исправлена некорректная передача информации о столбцах Nullable в двоичном протоколе MySQL #56799 (Serge Klochkov).
  • Добавлена поддержка файлов метаданных Iceberg в таблицах метахранилища #56810 (Kruglov Pavel).
  • Исправлено сообщение TSAN для transform #56817 (Raúl Marín).
  • Исправлено форматирование запроса SET и SETTINGS #56825 (Nikolay Degterinsky).
  • Исправлен сбой запуска из-за зависимости таблицы в joinGet #56828 (Nikolay Degterinsky).
  • Исправлена проблема с уплощением существующих столбцов типа Nested при выполнении ADD COLUMN #56830 (Nikolay Degterinsky).
  • Исправлено: допускается символ CR (возврат каретки) в конце строки в CSV #56901 (KevinyhZou).
  • Исправлена ошибка в функции tryBase64Decode при обработке некорректного ввода #56913 (Robert Schulze).
  • Исправлена ошибка генерации глубоко вложенных столбцов в схемах CapnProto/Protobuf #56941 (Kruglov Pavel).
  • Предотвращено выполнение несовместимого ALTER над столбцами PROJECTION #56948 (Amos Bird).
  • Исправлена проверка пути к файлу SQLite #56984 (San).
  • S3Queue: исправлено увеличение счётчика ссылок на метаданные #56990 (Kseniia Sumarokova).
  • Небольшое исправление в S3Queue #56999 (Kseniia Sumarokova).
  • Исправлена валидация пути к файлу для DatabaseFileSystem #57029 (San).
  • Исправлена ошибка в fuzzBits при использовании с ARRAY JOIN #57033 (Antonio Andelic).
  • Исправлено разыменование nullptr в частичном merge join с joined_subquery_re... #57048 (vdimir).
  • Исправлена гонка условий в RemoteSource #57052 (Raúl Marín).
  • Реализована bitHammingDistance для больших целых чисел #57073 (Alexey Milovidov).
  • Исправление ошибки с ссылками в стиле S3 #57075 (Yarik Briukhovetskyi).
  • Исправлена ошибка в функции JSON_QUERY с несколькими числовыми путями #57096 (KevinyhZou).
  • Исправлено переполнение буфера в кодеке Gorilla #57107 (Nikolay Degterinsky).
  • Закрывать межсерверное соединение при возникновении любого исключения до аутентификации #57142 (Antonio Andelic).
  • Исправлен segfault после выполнения ALTER UPDATE для столбца Nullable MATERIALIZED #57147 (Nikolay Degterinsky).
  • Исправлена некорректная оптимизация плана выполнения JOIN с частично материализованной обычной проекцией #57196 (Amos Bird).
  • При сравнении описаний столбцов комментарии игнорируются #57259 (Antonio Andelic).
  • Исправлена метрика ReadonlyReplica для всех случаев #57267 (Antonio Andelic).
  • Фоновые слияния теперь корректно используют временное хранилище данных в кэше #57275 (vdimir).
  • Исправление в Keeper для журнала изменений и снимков состояния #57299 (Antonio Andelic).
  • Игнорировать завершённые задачи ON CLUSTER, если имя хоста изменилось #57339 (Alexander Tokmakov).
  • Мутации в MergeTree повторно используют гранулярность индекса исходной части #57352 (Maksim Kita).
  • FS cache: добавлено ограничение на фоновую загрузку #57424 (Kseniia Sumarokova).

Релиз ClickHouse 23.10 от 2023-11-02

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

  • Больше нет возможности автоматически удалять повреждённые части данных. Это закрывает #55174. #55184 (Alexey Milovidov). #55557 (Jihyuk Bok).
  • Устаревшие части данных в памяти больше не могут считываться из журнала предзаписи (write-ahead log). Если у вас ранее были настроены части данных в памяти (in-memory parts), их необходимо удалить перед обновлением. #55186 (Alexey Milovidov).
  • Удалена интеграция с Meilisearch. Причина: она была совместима только со старой версией 0.18. В последней версии Meilisearch протокол был изменён, и интеграция больше не работает. Примечание: мы будем признательны, если вы поможете вернуть её обратно. #55189 (Alexey Milovidov).
  • Переименована концепция directory monitor в background INSERT. Все настройки *directory_monitor* были переименованы в distributed_background_insert*. Обратная совместимость должна сохраняться (так как старые настройки были добавлены как алиасы). #55978 (Azat Khuzhin).
  • send_timeout, установленный на стороне клиента, больше не интерпретируется как receive_timeout на стороне сервера, и наоборот. #56035 (Azat Khuzhin).
  • Сравнение временных интервалов с разными единицами измерения теперь будет выбрасывать исключение. Это закрывает #55942. Ранее вы могли неосознанно полагаться на поведение, при котором сравнивались лежащие в основе числовые значения независимо от единиц измерения. #56090 (Alexey Milovidov).
  • Полностью переработан экспериментальный движок таблиц S3Queue: изменён способ хранения информации в ZooKeeper, что позволяет выполнять меньше запросов в ZooKeeper, добавлено кеширование состояния ZooKeeper в случаях, когда известно, что состояние не изменится, улучшен процесс опроса S3, чтобы сделать его менее агрессивным, изменён способ обслуживания TTL и max для отслеживаемых файлов — теперь это фоновый процесс. Добавлены таблицы system.s3queue и system.s3queue_log. Закрывает #54998. #54422 (Kseniia Sumarokova).
  • Произвольные пути на HTTP-эндпоинте больше не интерпретируются как запрос к эндпоинту /query. #55521 (Konstantin Bogdanov).

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

  • Добавлена функция arrayFold(accumulator, x1, ..., xn -> expression, initial, array1, ..., arrayn), которая применяет лямбда-функцию к нескольким массивам одинаковой длины и накапливает результат в аккумуляторе. #49794 (Lirikl).
  • Поддержка формата Npy. SELECT * FROM file('example_array.npy', Npy). #55982 (Yarik Briukhovetskyi).
  • Если таблица имеет в своём ключе кривую, заполняющую пространство, например ORDER BY mortonEncode(x, y), то условия по её аргументам, например x >= 10 AND x <= 20 AND y >= 20 AND y <= 30, могут использоваться для индексации. Добавлена настройка analyze_index_with_space_filling_curves для включения или отключения этого анализа. Закрывает #41195. Продолжение #4538. Продолжение #6286. Продолжение #28130. Продолжение #41753. #55642 (Alexey Milovidov).
  • Добавлена новая настройка force_optimize_projection_name, принимающая имя проекции в качестве аргумента. Если ей присвоено непустое значение, ClickHouse проверяет, что эта проекция используется в запросе хотя бы один раз. Закрывает #55331. #56134 (Yarik Briukhovetskyi).
  • Добавлена поддержка асинхронных вставок с внешними данными через нативный протокол. Ранее это работало только в случае, если данные передавались внутри запроса. #54730 (Anton Popov).
  • Добавлена агрегатная функция lttb, которая использует алгоритм Largest-Triangle-Three-Buckets для даунсемплинга (уменьшения объёма) данных при визуализации. #53145 (Sinan).
  • Запрос CHECK TABLE теперь обладает лучшей производительностью и удобством использования (отправляет уведомления о ходе выполнения, может быть отменён). Поддерживается проверка конкретной части с помощью CHECK TABLE ... PART 'part_name'. #53404 (vdimir).
  • Добавлена функция jsonMergePatch. При работе с JSON-данными в виде строк она предоставляет способ объединять эти строки, каждая из которых содержит JSON-объект, в одну строку с одним JSON-объектом. #54364 (Memo).
  • Вторая часть поддержки диалекта Kusto Query Language. Реализация фазы 1 уже объединена. #42510 (larryluogit).
  • Добавлена новая SQL-функция arrayRandomSample(arr, k), которая возвращает выборку из k элементов входного массива. Ранее аналогичную функциональность можно было реализовать только с помощью менее удобного синтаксиса, например: "SELECT arrayReduce('groupArraySample(3)', range(10))". #54391 (itayisraelov).
  • Добавлены агрегатные комбинаторы -ArgMin/-ArgMax, которые позволяют выполнять агрегацию только по минимальным/максимальным значениям. Один из вариантов использования описан в #54818. Этот PR также переносит комбинаторы в отдельную директорию. #54947 (Amos Bird).
  • Добавлена возможность очищать кэш для формата Protobuf с помощью SYSTEM DROP SCHEMA FORMAT CACHE [FOR Protobuf]. #55064 (Aleksandr Musorin).
  • Добавлен внешний аутентификатор HTTP Basic. #55199 (Aleksei Filatov).
  • Добавлена функция byteSwap, которая обращает порядок байтов беззнаковых целых чисел. Это особенно полезно для обращения порядка байтов значений типов, которые внутренне хранятся как беззнаковые целые числа, например IPv4. #55211 (Priyansh Agrawal).
  • Добавлена функция formatQuery, которая возвращает форматированное представление (возможно, в несколько строк) строки SQL‑запроса. Также добавлена функция formatQuerySingleLine, которая делает то же самое, но возвращаемая строка не будет содержать переносов строки. #55239 (Salvatore Mesoraca).
  • Добавлен формат ввода DWARF, который считывает отладочные символы из ELF-исполняемого файла, библиотеки или объектного файла. #55450 (Michael Kolupaev).
  • Позволяет сохранять неразобранные записи и ошибки в движках RabbitMQ, NATS и FileLog. Добавлены виртуальные столбцы _error и _raw_message (для NATS и RabbitMQ), _raw_record (для FileLog), которые заполняются, когда ClickHouse не может разобрать новую запись. Поведение управляется настройками хранилища nats_handle_error_mode для NATS, rabbitmq_handle_error_mode для RabbitMQ, handle_error_mode для FileLog, аналогично kafka_handle_error_mode. Если задано значение default, при неудачной попытке ClickHouse разобрать запись будет выброшено исключение, а если задано значение stream, ошибка и сырая запись будут сохранены в виртуальные столбцы. Закрывает #36035. #55477 (Kruglov Pavel).
  • Улучшение клиента Keeper: добавлена команда get_all_children_number, которая возвращает общее количество дочерних узлов по указанному пути. #55485 (guoxiaolong).
  • Улучшен клиент Keeper: добавлена команда get_direct_children_number, возвращающая число непосредственных дочерних узлов по указанному пути. #55898 (xuzifu666).
  • Добавлен оператор SHOW SETTING setting_name, который является упрощённой версией существующего оператора SHOW SETTINGS. #55979 (Maksim Kita).
  • В таблицу system.parts_columns добавлены столбцы substreams и filenames. #55108 (Anton Popov).
  • Добавлена поддержка запроса SHOW MERGES. #55815 (megao).
  • Добавлена настройка create_table_empty_primary_key_by_default для задания ORDER BY () по умолчанию. #55899 (Srikanth Chekuri).

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

  • Добавлена опция query_plan_preserve_num_streams_after_window_functions для сохранения числа потоков после вычисления оконных функций, что позволяет выполнять параллельную обработку потоков. #50771 (frinkr).
  • Использовать больше потоков, если объём данных мал. #53867 (Jiebin Sun).
  • RoaringBitmaps теперь оптимизируются перед сериализацией. #55044 (UnamedRus).
  • Списки вхождений в инвертированных индексах теперь оптимизированы для использования максимально компактного представления внутренних битовых карт. В зависимости от степени повторяемости данных это может значительно снизить объем занимаемого места инвертированными индексами. #55069 (Harry Lee).
  • Уменьшена конкуренция за блокировку Context, что значительно улучшает производительность большого числа кратковременных параллельных запросов. #55121 (Maksim Kita).
  • Производительность создания инвертированного индекса улучшена на 30%. Этого удалось добиться за счёт замены std::unordered_map на absl::flat_hash_map. #55210 (Harry Lee).
  • Поддержка проталкивания фильтров ORC (на уровне rowgroup). #55330 (李扬).
  • Повышена производительность внешней агрегации при большом количестве временных файлов. #55489 (Maksim Kita).
  • По умолчанию установлен разумный размер кеша меток для вторичных индексов, чтобы избежать их повторной многократной загрузки. #55654 (Alexey Milovidov).
  • Избегайте избыточной реконструкции гранул индекса при чтении skip-индексов. Это решает проблему #55653. #55683 (Amos Bird).
  • Кэширование функции CAST в Set во время выполнения для повышения производительности функции IN, если тип элемента Set не полностью совпадает с типом столбца. #55712 (Duc Canh Le).
  • Повышена производительность ColumnVector::insertMany и ColumnVector::insertManyFrom. #55714 (frinkr).
  • Оптимизированы операции доступа по ключу в Map за счет предсказания позиции ключа следующей строки и уменьшения числа сравнений. #55929 (lgbo).
  • Добавлена поддержка отсечения полей структур в Parquet (в предыдущих версиях это в некоторых случаях не работало). #56117 (lgbo).
  • Добавлена возможность настраивать количество параллельных реплик, используемых при выполнении запроса, на основе оценки количества строк, подлежащих чтению. #51692 (Raúl Marín).
  • Оптимизировано потребление памяти при внешней агрегации в случаях, когда создаётся много временных файлов. #54798 (Nikita Taranov).
  • Распределённые запросы, выполняемые в режиме async_socket_for_remote (по умолчанию), теперь соблюдают ограничение max_threads. Ранее некоторые запросы могли создавать чрезмерное количество потоков (до max_distributed_connections), что вызывало проблемы с производительностью сервера. #53504 (filimonov).
  • Кэширование пропускаемых записей при выполнении DDL из очереди распределённого DDL в ZooKeeper. #54828 (Duc Canh Le).
  • Экспериментальные инвертированные индексы не сохраняют токены с слишком большим числом совпадений (т. е. идентификаторов строк в списке вхождений). Это экономит место и позволяет избежать неэффективных поисков по индексу в случаях, когда последовательное сканирование было бы столь же быстрым или быстрее. Предыдущая эвристика (параметр density, передаваемый в определение индекса), которая определяла, когда токены не должны сохраняться, была слишком запутанной для пользователей. Вводится гораздо более простая эвристика, основанная на параметре max_rows_per_postings_list (по умолчанию: 64k), которая напрямую задаёт максимально допустимое число идентификаторов строк в списке вхождений. #55616 (Harry Lee).
  • Повышена производительность записи в таблицы EmbeddedRocksDB. #55732 (Duc Canh Le).
  • Повышена общая надёжность ClickHouse при наличии большого числа частей в партиции (свыше 1000). Это может сократить количество ошибок TOO_MANY_PARTS. #55526 (Nikita Mikhaylov).
  • Снижено потребление памяти при загрузке иерархических словарей. #55838 (Nikita Taranov).
  • Все словари поддерживают настройку dictionary_use_async_executor. #55839 (vdimir).
  • Предотвращено чрезмерное потребление памяти при десериализации AggregateFunctionTopKGenericData. #55947 (Raúl Marín).
  • На Keeper с большим числом watches потоки AsyncMetrics могут на заметное время загружать CPU до 100% в DB::KeeperStorage::getSessionsWithWatchesCount. Исправление заключается в отказе от обхода тяжёлых множеств watches и list_watches. #56054 (Alexander Gololobov).
  • Добавлена настройка optimize_trivial_approximate_count_query для использования приблизительного значения count для хранилища EmbeddedRocksDB. Включено использование тривиального подсчёта для StorageJoin. #55806 (Duc Canh Le).

Улучшения

  • Функции toDayOfWeek (псевдоним MySQL: DAYOFWEEK), toYearWeek (YEARWEEK) и toWeek (WEEK) теперь поддерживают аргументы типа String. Это делает их поведение соответствующим поведению MySQL. #55589 (Robert Schulze).
  • Добавлена настройка date_time_overflow_behavior с возможными значениями ignore, throw, saturate, которая задаёт поведение при переполнении при преобразовании из типов Date, Date32, DateTime64, Integer или Float в Date, Date32, DateTime или DateTime64. #55696 (Andrey Zvonov).
  • Реализована поддержка параметров запроса для ALTER TABLE ... ACTION PARTITION [ID] {parameter_name:ParameterType}. Объединяет задачи #49516. Закрывает #49449. #55604 (alesapin).
  • Вывод идентификаторов процессоров в более наглядном виде в EXPLAIN. #48852 (Vlad Seliverstov).
  • Попытка создать прямой словарь с полем lifetime будет отклонена при создании (поскольку параметр lifetime не имеет смысла для прямых словарей). Исправления: #27861. #49043 (Rory Crispin).
  • Разрешено использование параметров в запросах по работе с партициями, например ALTER TABLE t DROP PARTITION. Закрывает #49449. #49516 (Nikolay Degterinsky).
  • Добавлен новый столбец xid в system.zookeeper_connection. #50702 (helifu).
  • Теперь в system.server_settings отображаются корректные настройки сервера после перезагрузки конфигурации. #53774 (helifu).
  • Добавлена поддержка математического символа минус в запросах, аналогично символу -. #54100 (Alexey Milovidov).
  • Добавлены группы реплик в экспериментальный движок базы данных Replicated. Закрывает #53620. #54421 (Nikolay Degterinsky).
  • Лучше повторять попытки при повторяемых ошибках S3, чем полностью завершать запрос с ошибкой. По умолчанию увеличено значение параметра s3_retry_attempts. #54770 (Sema Checherinda).
  • Добавлен режим балансировки нагрузки hostname_levenshtein_distance. #54826 (JackyWoo).
  • Улучшена маскировка секретных данных в логах. #55089 (Vitaly Baranov).
  • Пока что анализ PROJECTION выполняется только на уровне плана запроса. Настройка query_plan_optimize_projection признана устаревшей (она уже давно включена по умолчанию). #55112 (Nikita Mikhaylov).
  • Теперь, когда функция untuple вызывается для кортежа с именованными элементами и сама функция имеет псевдоним (например, select untuple(tuple(1)::Tuple(element_alias Int)) AS untuple_alias), имя результирующего столбца формируется из псевдонима untuple и псевдонима элемента кортежа (в примере: "untuple_alias.element_alias"). #55123 (garcher22).
  • Добавлена настройка describe_include_virtual_columns, которая позволяет включать виртуальные столбцы таблицы в результат выполнения запроса DESCRIBE. Добавлена настройка describe_compact_output. Если она установлена в значение true, запрос DESCRIBE возвращает только имена и типы столбцов без дополнительной информации. #55129 (Anton Popov).
  • Иногда выполнение OPTIMIZE с optimize_throw_if_noop=1 может завершаться с ошибкой unknown reason, тогда как истинной причиной являются разные проекции в разных частях. Это поведение исправлено. #55130 (Nikita Mikhaylov).
  • Позволяет использовать несколько таблиц MaterializedPostgreSQL, соответствующих одной и той же таблице Postgres. По умолчанию это поведение отключено (для совместимости, так как это изменение несовместимо с предыдущими версиями), но его можно включить с помощью настройки materialized_postgresql_use_unique_replication_consumer_identifier. Закрывает #54918. #55145 (Kseniia Sumarokova).
  • Добавлена возможность разбора отрицательных DateTime64 и DateTime с дробной частью из коротких строк. #55146 (Andrey Zvonov).
  • Для улучшения совместимости с MySQL 1. information_schema.tables теперь содержит новое поле table_rows, а 2. information_schema.columns теперь содержит новое поле extra. #55215 (Robert Schulze).
  • Clickhouse-client больше не будет показывать "0 rows in set", если результат содержит 0 строк и при этом было выброшено исключение. #55240 (Salvatore Mesoraca).
  • Добавлена поддержка операции переименования таблиц без ключевого слова TABLE, например RENAME db.t1 to db.t2. #55373 (凌涛).
  • Добавлен параметр internal_replication в system.clusters. #55377 (Konstantin Morozov).
  • Выбор удалённого прокси-резолвера в зависимости от протокола запроса, добавлена документация по возможностям прокси и удалён DB::ProxyConfiguration::Protocol::ANY. #55430 (Arthur Passos).
  • Исключены повторные попытки выполнения операций Keeper при INSERT после остановки таблицы. #55519 (Azat Khuzhin).
  • SHOW COLUMNS теперь корректно отображает тип FixedString как BLOB, если включена настройка use_mysql_types_in_show_columns. Также добавлены две новые настройки — mysql_map_string_to_text_in_show_columns и mysql_map_fixed_string_to_text_in_show_columns, — позволяющие переключать вывод типов String и FixedString между TEXT и BLOB. #55617 (Serge Klochkov).
  • При запуске таблиц ReplicatedMergeTree сервер ClickHouse проверяет набор частей на наличие неожиданных частей (существуют локально, но отсутствуют в ZooKeeper). Все неожиданные части перемещаются в каталог detached, и вместо них сервер пытается восстановить предковые (покрывающие) части. Теперь сервер пытается восстановить ближайшие предковые части вместо случайных покрывающих частей. #55645 (alesapin).
  • Расширенная панель мониторинга теперь поддерживает перетаскивание графиков на устройствах с сенсорным экраном. Это закрывает #54206. #55649 (Alexey Milovidov).
  • Теперь используется формат запроса по умолчанию, если он задан, при выводе исключения с http_write_exception_in_output_format. #55739 (Raúl Marín).
  • Улучшено сообщение для типичных проблем при работе с MATERIALIZED VIEW. #55826 (Raúl Marín).
  • Если вы удалили текущую базу данных, вы по‑прежнему сможете выполнять некоторые запросы в clickhouse-local и переключаться на другую базу данных. Это делает поведение единообразным с clickhouse-client. Тем самым закрывается задача #55834. #55853 (Alexey Milovidov).
  • Функции (add|subtract)(Year|Quarter|Month|Week|Day|Hour|Minute|Second|Millisecond|Microsecond|Nanosecond) теперь поддерживают аргументы даты в строковом виде, например SELECT addDays('2023-10-22', 1). Это повышает совместимость с MySQL и требуется для Tableau Online. #55869 (Robert Schulze).
  • Настройка apply_deleted_mask, если отключена, позволяет читать строки, которые были помечены как удалённые запросами легковесного удаления (lightweight DELETE). Это полезно для отладки. #55952 (Alexander Gololobov).
  • Добавлена возможность пропускать значения null при сериализации Tuple в JSON-объекты, что позволяет сохранить совместимость с функцией Spark to_json и также полезно для Gluten. #55956 (李扬).
  • Функции (add|sub)Date теперь поддерживают аргументы дат в строковом виде, например SELECT addDate('2023-10-22 11:12:13', INTERVAL 5 MINUTE). Аналогичная поддержка аргументов дат в строковом виде добавлена к операторам сложения и вычитания, например SELECT '2023-10-23' + INTERVAL 1 DAY. Это повышает совместимость с MySQL и необходимо для Tableau Online. #55960 (Robert Schulze).
  • Разрешено использование строк без кавычек с CR (\r) в формате CSV. Закрывает #39930. #56046 (Kruglov Pavel).
  • Добавлена возможность запускать clickhouse-keeper с использованием встроенной конфигурации. #56086 (Maksim Kita).
  • Установлено ограничение максимального значения параметра конфигурации queued.min.messages, чтобы избежать проблем при запуске чтения данных из Kafka. #56121 (Stas Morozov).
  • Исправлена опечатка в SQL-функции minSampleSizeContinous (переименована в minSampleSizeContinuous). Старое имя сохранено для обратной совместимости. Закрыта задача: #56139. #56143 (Dorota Szeremeta).
  • Перед завершением работы сервера выводится путь к повреждённым частям на диске. Ранее, если часть была повреждена на диске и сервер не мог запуститься, было почти невозможно определить, какая именно часть повреждена. Теперь это исправлено. #56181 (Duc Canh Le).

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

  • Если база данных в Docker уже инициализирована, её не нужно инициализировать повторно при последующих запусках. Это потенциально может исправить проблему бесконечных перезапусков контейнера, когда база данных не успевает загрузиться за 1000 попыток (актуально для очень больших баз данных и многонодовых конфигураций). #50724 (Alexander Nikolaev).
  • Ресурс с исходным кодом, включая подмодули, теперь собирается в специальной задаче сборки для Darwin. Он может использоваться для сборки ClickHouse без отдельной загрузки подмодулей. #51435 (Ilya Yatsishin).
  • Ошибка возникала при сборке ClickHouse с глобально включённой серией инструкций AVX (что не рекомендуется). Причина в том, что snappy не включает SNAPPY_HAVE_X86_CRC32. #55049 (monchickey).
  • Решена проблема с запуском отдельного clickhouse-keeper из пакета clickhouse-server. #55226 (Mikhail f. Shiryaev).
  • В тестах версия RabbitMQ обновлена до 3.12.6. Улучшен сбор логов для тестов RabbitMQ. #55424 (Ilya Yatsishin).
  • Сообщение об ошибке между openssl и boringssl приведено к единому виду, чтобы исправить функциональный тест. #55975 (MeenaRenganathan22).
  • Теперь используется основной (upstream) репозиторий для apache datasketches. #55787 (Nikita Taranov).

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

  • Не создавать жёсткие ссылки на файлы инвертированного индекса при мутациях #47663 (cangyin).
  • Исправлена ошибка в функции match (регулярное выражение), при которой шаблон с альтернативой приводил к некорректному ключевому условию. Закрывает #53222. #54696 (Yakov Olkhovskiy).
  • Исправлена ошибка 'Cannot find column' в оптимизации чтения в заданном порядке при использовании ARRAY JOIN #51746 (Nikolai Kochetov).
  • Добавлена поддержка экспериментальных подстолбцов Object(Nullable(json)) в запросах, которые ранее не обрабатывались. #54052 (zps).
  • Повторно применено исправление для accurateCastOrNull #54629 (Salvatore Mesoraca).
  • Исправлено определение DEFAULT для столбцов distributed таблицы, созданной без AS #55060 (Vitaly Baranov).
  • Корректная очистка ресурсов при возникновении исключения в конструкторе класса ShellCommandSource #55103 (Alexander Gololobov).
  • Устранена взаимоблокировка при обновлении роли, назначенной через LDAP #55119 (Julian Maicher).
  • Отключено обновление статистики ошибок для внутренних исключений #55128 (Robert Schulze).
  • Исправлена взаимная блокировка при резервном копировании #55132 (alesapin).
  • Исправлено получение файлов из хранилища Iceberg #55144 (Kseniia Sumarokova).
  • Исправлено отсечение партиций по дополнительным столбцам в Set. #55172 (Amos Bird).
  • Исправлен перерасчёт пропускающих индексов в запросах ALTER UPDATE для таблиц с адаптивной гранулярностью #55202 (Duc Canh Le).
  • Исправлена фоновая загрузка в кэше fs #55252 (Kseniia Sumarokova).
  • Предотвращены возможные утечки памяти в компрессорах при отсутствии финализации буфера #55262 (Azat Khuzhin).
  • Исправлено выполнение функций с разрежёнными столбцами #55275 (Azat Khuzhin).
  • Исправлено некорректное слияние Nested при SELECT FINAL FROM SummingMergeTree #55276 (Azat Khuzhin).
  • Исправлена ошибка, из-за которой было невозможно удалить отсоединённую партицию в реплицированном MergeTree поверх S3 без zero-copy #55309 (alesapin).
  • Исправлена ошибка, приводившая к падению MergeSortingPartialResultTransform (из-за пустых фрагментов после remerge) #55335 (Azat Khuzhin).
  • Исправлена гонка данных в CreatingSetsTransform при обработке ошибок из-за выбрасывания разделяемого исключения #55338 (Azat Khuzhin).
  • Исправлена оптимизация trash (в некоторой степени) #55353 (Alexey Milovidov).
  • Устранена утечка в StorageHDFS #55370 (Azat Khuzhin).
  • Исправлен разбор массивов оператором CAST #55417 (Anton Popov).
  • Исправлена фильтрация по виртуальным столбцам при использовании оператора OR в запросе #55418 (Azat Khuzhin).
  • Исправлены проблемы подключения к MongoDB #55419 (Nikolay Degterinsky).
  • Исправлено представление булевых значений в интерфейсе MySQL #55427 (Serge Klochkov).
  • Исправлено форматирование DateTime в текстовом протоколе MySQL и вывод типов LowCardinality(Nullable(T)) #55479 (Serge Klochkov).
  • Параметр use_mysql_types_in_show_columns теперь влияет только на SHOW COLUMNS #55481 (Robert Schulze).
  • Исправлена некорректная обработка DW_FORM_ref_addr в символизаторе стека, которая иногда приводила к его падению #55483 (Michael Kolupaev).
  • Теперь fiber уничтожается при возникновении исключения в cancelBefore в AsyncTaskExecutor #55516 (Kruglov Pavel).
  • Исправлена проблема, из-за которой параметры запроса не работали с пользовательскими HTTP-обработчиками #55521 (Konstantin Bogdanov).
  • Исправлена проверка необработанных данных для формата Values #55527 (Azat Khuzhin).
  • Исправлена ошибка «Invalid cursor state» в драйвере ODBC при работе с MS SQL Server #55558 (vdimir).
  • Исправлены максимальное время выполнения запроса и режим обработки переполнения 'break' #55577 (Alexander Gololobov).
  • Исправлено аварийное завершение работы QueryNormalizer при циклических псевдонимах #55602 (vdimir).
  • Отключена некорректная оптимизация и добавлен тест #55609 (Alexey Milovidov).
  • Объединены #52352 и #55621 (Alexey Milovidov).
  • Добавлен тест, чтобы избежать некорректной сортировки десятичных чисел #55662 (Amos Bird).
  • Исправлен индикатор прогресса для кластерных функций S3 и Azure с URL-адресами без масок (globs) #55666 (Kruglov Pavel).
  • Исправлена проблема с фильтрацией по виртуальным столбцам с использованием фильтра OR в запросе (повторная отправка) #55678 (Azat Khuzhin).
  • Исправления и улучшения в хранилище Iceberg #55695 (Kruglov Pavel).
  • Исправлена гонка данных в CreatingSetsTransform (v2) #55786 (Azat Khuzhin).
  • Генерировать исключение при разборе некорректной строки в число с плавающей запятой, если precise_float_parsing равно true #55861 (李扬).
  • Отключено проталкивание предикатов, если CTE содержит функции с сохранением состояния #55871 (Raúl Marín).
  • Исправлена нормализация ASTSelectWithUnionQuery, из‑за которой из запроса удалялся FORMAT #55887 (flynn).
  • Попытка исправить возможный сбой сегментации (segfault) во входном формате Native ORC #55891 (Kruglov Pavel).
  • Исправлена работа оконных функций при разреженных столбцах. #55895 (János Benjamin Antal).
  • fix: StorageNull теперь поддерживает подстолбцы #55912 (FFish).
  • Не записывать повторяемые ошибки для операций Replicated mutate/merge в журнал ошибок #55944 (Azat Khuzhin).
  • Исправлена работа команды SHOW DATABASES LIMIT &lt;N&gt; #55962 (Raúl Marín).
  • Исправлена автоматически сгенерированная схема Protobuf для полей с символом подчёркивания в имени #55974 (Kruglov Pavel).
  • Исправлена работа dateTime64ToSnowflake64() при использовании масштаба, отличного от значения по умолчанию #55983 (Robert Schulze).
  • Исправлены операции ввода/вывода для столбца Arrow со словарём #55989 (Kruglov Pavel).
  • Исправлено получение схемы из реестра схем в AvroConfluent #55991 (Kruglov Pavel).
  • Исправлена ошибка 'Block structure mismatch' при одновременном выполнении операций ALTER и INSERT в таблице Buffer #55995 (Michael Kolupaev).
  • Исправлен некорректный расчет свободного пространства в политике JBOD least_used #56030 (Azat Khuzhin).
  • Исправлена ошибка, возникавшая из-за отсутствующего скаляра при вычислении подзапросов в табличных функциях #56057 (Amos Bird).
  • Исправлено получение некорректного результата запроса при http_write_exception_in_output_format=1 #56135 (Kruglov Pavel).
  • Исправлен кэш схемы для резервного варианта JSON->JSONEachRow при изменённых настройках #56172 (Kruglov Pavel).
  • Добавлен обработчик ошибок в компонент odbc-bridge #56185 (Yakov Olkhovskiy).

Релиз ClickHouse 23.9 от 2023-09-28

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

  • Удалён конфигурационный параметр status_info и статус словарей из обработчика Prometheus по умолчанию. #54090 (Alexey Milovidov).
  • Экспериментальный кэш метаданных частей удалён из кодовой базы. #54215 (Alexey Milovidov).
  • Настройка input_format_json_try_infer_numbers_from_strings больше не включена по умолчанию, поэтому мы не пытаемся определять числа по строкам в форматах JSON, чтобы избежать возможных ошибок разбора, когда в примерах данных есть строки, выглядящие как числа. #55099 (Kruglov Pavel).

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

  • Улучшен вывод схемы из форматов JSON: 1) Теперь возможно выводить именованные Tuple из JSON-объектов без экспериментального типа JSON с помощью настройки input_format_json_try_infer_named_tuples_from_objects в JSON-форматах. Ранее без экспериментального типа JSON мы могли выводить JSON-объекты только как String или Map, теперь мы можем выводить именованный Tuple. Итоговый тип Tuple будет содержать все ключи объектов, которые были прочитаны в выборке данных во время вывода схемы. Это может быть полезно для чтения структурированных JSON-данных без разреженных объектов. Настройка включена по умолчанию. 2) Разрешён разбор JSON-массива в столбец типа String с помощью настройки input_format_json_read_arrays_as_strings. Это может помочь при чтении массивов со значениями разных типов. 3) Разрешено использовать тип String для JSON-ключей со значениями неизвестных типов (null/[]/{}) в выборке данных с помощью настройки input_format_json_infer_incomplete_types_as_strings. Теперь в JSON-форматах мы можем читать любое значение в столбец типа String и можем избежать ошибки Cannot determine type for column 'column_name' by first 25000 rows of data, most likely this column contains only Nulls or empty Arrays/Maps во время вывода схемы, используя тип String для неизвестных типов, так что данные будут успешно прочитаны. #54427 (Kruglov Pavel).
  • Добавлена поддержка планирования ввода-вывода (IO scheduling) для удалённых дисков. Конфигурация хранилища для типов дисков s3, s3_plain, hdfs и azure_blob_storage теперь может содержать элементы read_resource и write_resource, в которых указываются имена ресурсов. Политики планирования для этих ресурсов можно настроить в отдельной секции конфигурации сервера resources. Запросы могут помечаться с помощью настройки workload и классифицироваться с помощью секции конфигурации сервера workload_classifiers для достижения различных целей планирования использования ресурсов. Более подробная информация в документации. #47009 (Sergei Trifonov). Добавлен тип узла планирования ввода-вывода bandwidth_limit. Он позволяет задать ограничения max_speed и max_burst на трафик, проходящий через этот узел. #54618 (Sergei Trifonov).
  • Добавлен новый тип аутентификации на основе SSH-ключей. Он работает только для нативного протокола TCP. #41109 (George Gamezardashvili).
  • Добавлен новый столбец _block_number для таблиц MergeTree. #44532. #47532 (SmitaRKulkarni).
  • Добавлено предложение IF EMPTY для запросов DROP TABLE. #48915 (Pavel Novitskiy).
  • SQL-функции toString(datetime, timezone) и formatDateTime(datetime, format, timezone) теперь поддерживают неконстантные аргументы часового пояса. #53680 (Yarik Briukhovetskyi).
  • Добавлена поддержка ALTER TABLE MODIFY COMMENT. Примечание: нечто подобное было добавлено внешним участником сообщества давно, но функциональность совсем не работала и лишь вводила пользователей в заблуждение. Это закрывает #36377. #51304 (Alexey Milovidov). Примечание: эта команда не распространяется между репликами, поэтому реплики таблицы могут иметь разные комментарии.
  • Добавлен GCD, также известный как «greatest common divisor», в качестве нового кодека сжатия данных. Кодек вычисляет GCD всех значений столбца, а затем делит каждое значение на GCD. Кодек GCD является кодеком подготовки данных (аналогично Delta и DoubleDelta) и не может использоваться отдельно. Он работает с целочисленными, десятичными типами данных и типами дата/время. Типичным вариантом применения кодека GCD являются значения столбца, которые изменяются (увеличиваются/уменьшаются) на величину, кратную GCD, например 24 - 28 - 16 - 24 - 8 - 24 (при GCD = 4). #53149 (Alexander Nam).
  • Добавлены два новых псевдонима типов: DECIMAL(P) (как сокращённая форма DECIMAL(P, 0)) и DECIMAL (как сокращённая форма DECIMAL(10, 0)). Это делает ClickHouse более совместимым с SQL-диалектом MySQL. #53328 (Val Doroshchuk).
  • Добавлена новая таблица системного лога backup_log для отслеживания всех операций BACKUP и RESTORE. #53638 (Victor Krasnov).
  • Добавлена настройка формата вывода output_format_markdown_escape_special_characters (по умолчанию — false). Эта настройка определяет, экранируются ли специальные символы, такие как !, #, $ и т.д. (то есть предваряются обратной косой чертой) в формате вывода Markdown. #53860 (irenjj).
  • Добавлена функция decodeHTMLComponent. #54097 (Bharat Nallan).
  • В таблицу query_log добавлен peak_threads_usage. #54335 (Alexey Gerasimchuck).
  • Добавлена поддержка команды SHOW FUNCTIONS в clickhouse-client. #54337 (Julia Kartseva).
  • Добавлена функция toDaysSinceYearZero с псевдонимом TO_DAYS (для совместимости с MySQL), которая возвращает количество дней, прошедших с 0001-01-01 (в пролептическом григорианском календаре). #54479 (Robert Schulze). Функция toDaysSinceYearZero теперь поддерживает аргументы типа DateTime и DateTime64. #54856 (Serge Klochkov).
  • Добавлены функции YYYYMMDDtoDate, YYYYMMDDtoDate32, YYYYMMDDhhmmssToDateTime и YYYYMMDDhhmmssToDateTime64. Они преобразуют дату или дату и время, закодированные в виде целого числа (например, 20230911), в нативный тип даты или даты и времени. Таким образом, они выполняют противоположное преобразование по сравнению с существующими функциями YYYYMMDDToDate, YYYYMMDDToDateTime, YYYYMMDDhhmmddToDateTime, YYYYMMDDhhmmddToDateTime64. #54509 (Quanfa Fu) (Robert Schulze).
  • Добавлено несколько функций для вычисления расстояния между строками, включая byteHammingDistance, editDistance. #54935 (flynn).
  • Теперь можно указывать дату окончания срока действия и, при необходимости, время для учетных данных пользователя в предложении VALID UNTIL datetime. #51261 (Nikolay Degterinsky).
  • Разрешены URL в стиле S3 для табличных функций s3, gcs, oss. URL автоматически преобразуется в HTTP. Пример: 's3://clickhouse-public-datasets/hits.csv' преобразуется в 'https://clickhouse-public-datasets.s3.amazonaws.com/hits.csv'. #54931 (Yarik Briukhovetskyi).
  • Добавлена новая настройка print_pretty_type_names для красивого вывода глубоко вложенных типов, таких как Tuple/Maps/Arrays. #55095 (Kruglov Pavel).

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

  • Ускорено чтение из S3 за счет включения предзагрузки данных по умолчанию. #53709 (Alexey Milovidov).
  • Не читать неявно PK и столбцы версий в одиночных частях, если это не требуется для запросов с FINAL. #53919 (Duc Canh Le).
  • Оптимизирована группировка по константным ключам. Теперь после https://github.com/ClickHouse/ClickHouse/pull/53529 оптимизируются запросы с GROUP BY _file/_path. #53549 (Kruglov Pavel).
  • Улучшена производительность сортировки для столбцов типа Decimal. Улучшена производительность вставки в MergeTree, если в ORDER BY содержится столбец типа Decimal. Улучшена производительность сортировки для уже отсортированных или почти отсортированных данных. #35961 (Maksim Kita).
  • Улучшена производительность при анализе очень больших запросов. Исправляет #51224. #51469 (frinkr).
  • Оптимизация, позволяющая переписывать COUNT(DISTINCT ...) и различные варианты функции uniq в count, если они выбираются из подзапроса с GROUP BY. #52082 #52645 (JackyWoo).
  • Удалены ручные вызовы mmap/mremap/munmap, а вся эта работа делегирована jemalloc, что слегка улучшило производительность. #52792 (Nikita Taranов).
  • Исправлено высокое потребление CPU при работе с NATS. #54399 (Vasilev Pyotr).
  • Так как для выполнения toString с аргументом типа DateTime используются отдельные инструкции, можно немного улучшить производительность для аргументов других типов и сделать некоторые участки кода более чистыми. Продолжение работы по задаче #53680. #54443 (Yarik Briukhovetskyi).
  • Вместо сериализации JSON-элементов в std::stringstream результат сериализации теперь записывается непосредственно в ColumnString. #54613 (lgbo).
  • Включена оптимизация ORDER BY для чтения данных в соответствующем порядке из таблицы MergeTree, когда эта таблица используется в представлении. #54628 (Vitaly Baranov).
  • Улучшены SQL-функции для JSON за счёт повторного использования GeneratorJSONPath и удаления нескольких разделяемых указателей. #54735 (lgbo).
  • Keeper пытается объединять запросы на сброс в батчи для повышения производительности. #53049 (Antonio Andelic).
  • Теперь clickhouse-client обрабатывает файлы параллельно при использовании INFILE 'glob_expression'. Закрыта задача #54218. #54533 (Max K.).
  • Теперь можно использовать первичный ключ для функции IN, даже когда типы столбцов первичного ключа отличаются от типов столбцов в правой части функции IN. Пример: SELECT id FROM test_table WHERE id IN (SELECT '5'). Закрывает #48936. #54544 (Maksim Kita).
  • Hash JOIN пытается уменьшить внутренние буферы, использующие половину максимально доступного объёма памяти (задаётся настройкой max_bytes_in_join). #54584 (vdimir).
  • Соблюдать max_block_size для array join, чтобы избежать возможного OOM. Закрывает #54290. #54664 (李扬).
  • Повторное использование HTTP‑соединений в табличной функции s3. #54812 (Michael Kolupaev).
  • Линейный поиск в MergeTreeRangeReader::Stream::ceilRowsToCompleteGranules заменён на двоичный. #54869 (usurai).

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

  • Создание индексов Annoy теперь может выполняться параллельно с использованием настройки max_threads_for_annoy_index_creation. #54047 (Robert Schulze).
  • Параллельные реплики для распределённых таблиц теперь не читают со всех реплик. #54199 (Igor Nikonov).

Улучшения

  • Позволяет заменять длинные имена файлов столбцов в частях данных MergeTree на хэши этих имён. Это помогает в некоторых случаях избежать ошибки File name too long. #50612 (Anton Popov).
  • Разбирать данные в формате JSON как JSONEachRow, если не удалось разобрать метаданные. Это позволит читать файлы с расширением .json, даже если фактический формат — JSONEachRow. Закрывает #45740. #54405 (Kruglov Pavel).
  • Выводить корректный JSON/XML при возникновении исключения во время выполнения HTTP-запроса. Добавлена настройка http_write_exception_in_output_format для включения или отключения этого поведения (по умолчанию включено). #52853 (Kruglov Pavel).
  • Представление information_schema.tables теперь содержит новый столбец data_length, который показывает приблизительный размер данных на диске. Это изменение необходимо для выполнения запросов, генерируемых Amazon QuickSight. #55037 (Robert Schulze).
  • Интерфейс MySQL получил минимальную реализацию механизма подготовленных команд, достаточную для подключения Tableau Online к ClickHouse через коннектор MySQL. #54115 (Serge Klochkov). Обратите внимание: реализация подготовленных команд крайне минимальна, привязка аргументов пока не поддерживается, так как она не требуется в данном конкретном сценарии использования Tableau Online. Она будет реализована дополнительно при необходимости после тщательного тестирования Tableau Online, если мы обнаружим проблемы.
  • Добавлена поддержка режимов сопоставления без учета регистра и «dot-all» в словарях regexp_tree. #50906 (Johann Gan).
  • Улучшение Keeper: добавлена команда createIfNotExists. #48855 (Konstantin Bogdanov).
  • Более точное выведение типов целых чисел, исправлена проблема #51236. #53003 (Chen768959).
  • Добавлено определение кодировок в строковых литералах для MaterializedMySQL. #53220 (Val Doroshchuk).
  • Исправлена неочевидная проблема с редко используемым движком таблицы EmbeddedRocksDB в крайне редком сценарии: иногда этот движок некорректно закрывал файлы на NFS после выполнения DROP TABLE. #53502 (Mingliang Pan).
  • RESTORE TABLE ON CLUSTER должен создавать реплицированные таблицы с одинаковым UUID на всех хостах. В противном случае макрос {uuid} в пути в ZooKeeper не сможет корректно работать после RESTORE. Это реализовано в этом PR. #53765 (Vitaly Baranov).
  • Добавлена настройка восстановления restore_broken_parts_as_detached: если она имеет значение true, процесс RESTORE не будет останавливаться на повреждённых частях при восстановлении, вместо этого все повреждённые части будут скопированы в папку detached с префиксом broken-from-backup'. Если она имеет значение false, процесс RESTORE остановится на первой повреждённой части (если таковая есть). Значение по умолчанию — false. #53877 (Vitaly Baranov).
  • Добавлено поле elapsed_ns в HTTP-заголовки X-ClickHouse-Progress и X-ClickHouse-Summary. #54179 (joelynch).
  • Реализация команд reconfig (https://github.com/ClickHouse/ClickHouse/pull/49450), sync и exists в keeper-client. #54201 (pufit).
  • clickhouse-local и clickhouse-client теперь позволяют указывать параметр --query несколько раз, например ./clickhouse-client --query "SELECT 1" --query "SELECT 2". Этот синтаксис немного более интуитивен, чем ./clickhouse-client --multiquery "SELECT 1;S ELECT 2", чуть проще для использования в скриптах (например, queries.push_back('--query "$q"')) и в большей степени соответствует поведению уже существующего параметра --queries-file (например, ./clickhouse client --queries-file queries1.sql --queries-file queries2.sql). #54249 (Robert Schulze).
  • Добавлена поддержка субсекундной точности для formatReadableTimeDelta. #54250 (Andrey Zvonov).
  • По умолчанию включена настройка allow_remove_stale_moving_parts. #54260 (vdimir).
  • Исправлено использование count из кэша и улучшен индикатор прогресса при чтении из архивов. #54271 (Kruglov Pavel).
  • Добавлена поддержка учетных данных S3 с использованием SSO. Чтобы задать профиль, который будет использоваться с SSO, установите переменную среды AWS_PROFILE. #54347 (Antonio Andelic).
  • Добавлена поддержка значения NULL по умолчанию для вложенных типов данных Array/Tuple/Map во входных форматах. Закрывает #51100. #54351 (Kruglov Pavel).
  • Добавлена поддержка чтения некоторых нетипичных конфигураций фрагментов из форматов Arrow/Parquet. #54370 (Arthur Passos).
  • Добавлен псевдоним STD к функции stddevPop для обеспечения совместимости с MySQL. Закрывает #54274. #54382 (Nikolay Degterinsky).
  • Добавлены функции addDate для совместимости с MySQL и subDate для единообразия. См. #54275. #54400 (Nikolay Degterinsky).
  • В таблицу system.detached_parts добавлен столбец modification_time. #54506 (Azat Khuzhin).
  • Добавлена настройка splitby_max_substrings_includes_remaining_string, которая определяет, включают ли функции splitBy*() с аргументом max_substring > 0 оставшуюся часть строки (если она есть) в результирующий массив (семантика Python/Spark) или нет. Поведение по умолчанию не изменилось. #54518 (Robert Schulze).
  • Улучшено выведение целочисленных типов для полей Int64/UInt64. Продолжение #53003. Теперь оно работает и для вложенных типов, таких как массивы массивов, а также для функций вроде map/tuple. Задача: #51236. #54553 (Kruglov Pavel).
  • Добавлены операции над массивами для умножения, деления и вычисления остатка от деления на скаляр. Работают в обе стороны, например 5 * [5, 5] и [5, 5] * 5 — оба варианта возможны. #54608 (Yarik Briukhovetskyi).
  • Добавлен необязательный аргумент version к команде rm в keeper-client для более безопасного выполнения операций удаления. #54708 (János Benjamin Antal).
  • Отключено принудительное завершение сервера через systemd, так как это могло приводить к потере данных при использовании таблиц Buffer. #54744 (Azat Khuzhin).
  • Добавлено поле is_deterministic в системную таблицу system.functions, которое указывает, остаётся ли результат функции неизменным при двух вызовах с точно такими же входными данными или нет. #54766 #55035 (Robert Schulze).
  • Представления в схеме information_schema сделаны более совместимыми с эквивалентными представлениями в MySQL (то есть изменены и расширены) до такой степени, что Tableau Online может подключаться к ClickHouse. В частности: 1. Тип поля information_schema.tables.table_type изменён с Enum8 на String. 2. В представление information_schema.table добавлены поля table_comment и table_collation. 3. Добавлены представления information_schema.key_column_usage и referential_constraints. 4. В представлениях information_schema псевдонимы в верхнем регистре заменены на конкретные столбцы с именами в верхнем регистре. #54773 (Serge Klochkov).
  • Кэш запросов теперь возвращает ошибку, если вы пытаетесь закэшировать результат запроса с недетерминированной функцией, такой как now, randomString или dictGet. По сравнению с предыдущим поведением (результат просто не кэшировался), это снижает путаницу и эффект неожиданности. #54801 (Robert Schulze).
  • Запрещено использование специальных столбцов, таких как materialized/ephemeral/alias, для хранилищ file/s3/url/..., исправлена вставка в ephemeral‑столбцы из файлов. Закрывает #53477. #54803 (Kruglov Pavel).
  • Более настраиваемый сбор метаданных для резервного копирования. #54804 (Vitaly Baranov).
  • Файл журнала clickhouse-local (если включён с помощью флага --server_logs_file) теперь будет префиксовать каждую строку меткой времени, идентификатором потока и т.д., аналогично clickhouse-server. #54807 (Michael Kolupaev).
  • Поле is_obsolete в таблице system.merge_tree_settings — теперь для устаревших настроек MergeTree его значение равно 1. Ранее об устаревании настройки сообщалось только в описании. #54837 (Robert Schulze).
  • Добавлена возможность использовать форму множественного числа в литералах интервала. INTERVAL 2 HOURS должен быть эквивалентен INTERVAL 2 HOUR. #54860 (Jordi Villar).
  • Всегда разрешать создание проекций с первичным ключом (PK) типа Nullable. Это исправляет #54814. #54895 (Amos Bird).
  • Повторять операции резервного копирования в S3 после сбоя из‑за разрыва соединения. #54900 (Vitaly Baranov).
  • Сделано более точным сообщение об исключении для случая, когда максимальное значение настройки меньше минимального. #54925 (János Benjamin Antal).
  • Функции сопоставления LIKE, match и другие теперь позволяют выполнять сопоставление с шаблонами, содержащими подстроки, не являющиеся UTF-8, путём перехода к двоичному сопоставлению. Пример: вы можете использовать string LIKE '\xFE\xFF%' для обнаружения BOM. Это закрывает #54486. #54942 (Alexey Milovidov).
  • Добавлено событие профилирования ContextLockWaitMicroseconds. #55029 (Maksim Kita).
  • Keeper теперь динамически изменяет уровни логирования. #50372 (helifu).
  • Добавлена функция timestamp для совместимости с MySQL. Закрывает #54275. #54639 (Nikolay Degterinsky).

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

  • Обновлён компилятор для официальных сборок ClickHouse и сборок в системе непрерывной интеграции с Clang 16 до 17. #53831 (Robert Schulze).
  • Перегенерированы данные TLD для поиска (tldLookup.generated.cpp). #54269 (Bharat Nallan).
  • Удалена избыточная символьная ссылка clickhouse-keeper-client. #54587 (Tomas Barton).
  • Используется /usr/bin/env для поиска bash — теперь поддерживается NixOS. #54603 (Fionera).
  • В CMake добавлена опция PROFILE_CPU, необходимая для выполнения perf record без использования графа вызовов DWARF. #54917 (Maksim Kita).
  • Если компоновщик отличается от LLD, сборка завершается с фатальной ошибкой. #55036 (Alexey Milovidov).
  • Заменена библиотека для обработки (кодирования/декодирования) значений в формате base64 с Turbo-Base64 на aklomp-base64. Обе используют SIMD-ускорение на x86 и ARM, но: 1) лицензия второй (BSD-2) более благоприятна для ClickHouse, тогда как Turbo64 тем временем перешла на GPL-3; 2) с большим числом звёзд на GitHub aklomp-base64 выглядит более перспективной; 3) aklomp-base64 имеет немного более удобный API (что, разумеется, субъективно); и 4) aklomp-base64 не требует обходных решений вокруг багов (например, потоконебезопасной инициализации). Примечание: aklomp-base64 отвергает значения base64 без паддинга, тогда как Turbo-Base64 декодирует их по принципу «best effort». RFC-4648 оставляет открытым вопрос, является ли паддинг обязательным, но в зависимости от контекста это может привести к изменению поведения, о котором следует помнить. #54119 (Mikhail Koviazin).

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

  • Исправлены операции REPLACE/MOVE PARTITION при использовании zero-copy replication (примечание: «zero-copy replication» — экспериментальная функция) #54193 (Alexander Tokmakov).
  • Исправлены блокировки механизма zero-copy при использовании hardlinks (примечание: «zero-copy replication» — экспериментальная функция) #54859 (Alexander Tokmakov).
  • Исправлено накопление мусора в zero copy (примечание: «zero-copy replication» — экспериментальная функция) #54550 (Alexander Tokmakov).
  • Передавать таймаут повторных HTTP-запросов в миллисекундах (раньше он передавался некорректно). #54438 (Duc Canh Le).
  • Исправлено вводящее в заблуждение сообщение об ошибке OUTFILE при использовании CapnProto/Protobuf #52870 (Kruglov Pavel).
  • Исправлено формирование сводной статистики при использовании параллельных реплик с LIMIT #53050 (Raúl Marín).
  • Исправлено ограничение скорости выполнения BACKUP-ов при работе с S3 (в случаях, когда не использовалось нативное копирование), а также в некоторых других местах #53336 (Azat Khuzhin).
  • Исправлено дросселирование операций ввода-вывода (I/O throttling) при копировании целых каталогов #53338 (Azat Khuzhin).
  • Исправление: при переносе действий в условие PREWHERE столбец мог теряться #53492 (Yakov Olkhovskiy).
  • Исправлена внутренняя ошибка при замене частей на байтово идентичные #53735 (Pedro Riera).
  • Исправлено: теперь требуется наличие столбцов, участвующих в выражении interpolate #53754 (Yakov Olkhovskiy).
  • Исправлена инициализация обнаружения кластера и установка точек отказа в конфигурации #54113 (vdimir).
  • Исправлены проблемы в функции accurateCastOrNull #54136 (Salvatore Mesoraca).
  • Исправлена ошибка в Nullable первичном ключе с модификатором FINAL #54164 (Amos Bird).
  • Исправлена ошибка, из-за которой вставка новых данных в реплицируемую materialized view могла завершаться неудачей при наличии дублирующихся данных. #54184 (Pedro Riera).
  • Исправление: разрешён IPv6 для bloom-фильтра #54200 (Yakov Olkhovskiy).
  • исправлено возможное несоответствие типов с IPv4 #54212 (Bharat Nallan).
  • Исправлена system.data_skipping_indices для заново созданных индексов #54225 (Artur Malchanau).
  • исправлен конфликт имён для multiple join rewriter v2 #54240 (Tao Wang).
  • Исправлены неожиданные ошибки в system.errors после выполнения JOIN #54306 (vdimir).
  • Исправлена ошибка в isZeroOrNull(NULL) #54316 (flynn).
  • Исправлено: параллельные реплики поверх Distributed при prefer_localhost_replica = 1 #54334 (Igor Nikonov).
  • Исправлена логическая ошибка в вертикальном слиянии + ReplacingMergeTree + очистке при OPTIMIZE #54368 (alesapin).
  • Исправлена потенциальная ошибка URI contains invalid characters в табличной функции s3 #54373 (Kruglov Pavel).
  • Исправлена ошибка сегментации (segfault) при оптимизации AST функции arrayExists #54379 (Nikolay Degterinsky).
  • Проверка переполнения перед сложением в функции analysisOfVariance #54385 (Antonio Andelic).
  • Ошибка в removeSharedRecursive воспроизведена и исправлена #54430 (Sema Checherinda).
  • Исправлен возможный некорректный результат при использовании SimpleAggregateFunction в PREWHERE и FINAL #54436 (Azat Khuzhin).
  • Исправлена фильтрация частей с indexHint для случаев без analyzer #54449 (Azat Khuzhin).
  • Исправлена работа агрегатных проекций с нормализованными состояниями #54480 (Amos Bird).
  • clickhouse-local: исправление, связанное с параметром multiquery #54498 (CuiShuoGuo).
  • clickhouse-local теперь поддерживает аргумент командной строки --database #54503 (vdimir).
  • Исправлена потенциальная ошибка парсинга в форматах -WithNames при отключённом input_format_with_names_use_header #54513 (Kruglov Pavel).
  • Исправлен редкий случай возникновения ошибки CHECKSUM_DOESNT_MATCH #54549 (alesapin).
  • Исправлена обработка сортировки в UNION ALL для уже отсортированных результатов #54564 (Vitaly Baranov).
  • Исправлена установка снапшота в Keeper #54572 (Antonio Andelic).
  • Устранено состояние гонки в ColumnUnique #54575 (Nikita Taranov).
  • Индекс Annoy/Usearch: исправлена ошибка LOGICAL_ERROR, возникавшая при построении со значениями по умолчанию #54600 (Robert Schulze).
  • Исправлена сериализация для ColumnDecimal #54601 (Nikita Taranov).
  • Исправлено определение схемы в функциях *Cluster для имён столбцов, содержащих пробелы #54635 (Kruglov Pavel).
  • Исправлено использование структуры таблиц-приёмников в случае значений по умолчанию и явного указания столбцов в INSERT #54655 (Kruglov Pavel).
  • Исправление: избегать использования сопоставления с регулярным выражением, которое может содержать альтернативы, в качестве ключевого условия. #54696 (Yakov Olkhovskiy).
  • Исправлена проблема в ReplacingMergeTree при вертикальном слиянии и очистке #54706 (SmitaRKulkarni).
  • Исправлена проблема, из-за которой виртуальные столбцы получали неверные значения после ORDER BY #54811 (Michael Kolupaev).
  • Исправлена фильтрация частей с indexHint для non-analyzer #54825 #54449 (Azat Khuzhin).
  • Исправлено падение Keeper из-за ошибки сегментации при завершении работы #54841 (Antonio Andelic).
  • Исправлена ошибка Invalid number of rows in Chunk в MaterializedPostgreSQL #54844 (Kseniia Sumarokova).
  • Устаревшие настройки форматов перенесены в отдельный раздел #54855 (Kruglov Pavel).
  • Теперь minmax_count_projection перестраивается при изменении ключа партиции #54943 (Amos Bird).
  • Исправлено некорректное приведение типа к ColumnVector<Int128> в функции if #55019 (Kruglov Pavel).
  • Предотвращена возможность присоединения частей таблиц с разными проекциями или индексами #55062 (János Benjamin Antal).
  • Сохранять NULL в отображении скалярных результатов при пустом результате подзапроса #52240 (vdimir).
  • Исправлена ошибка, из-за которой оператор FINAL в редких случаях формировал некорректные диапазоны чтения #54934 (Nikita Taranov).
  • Исправлено: кворум вставки без повторных попыток ClickHouse Keeper #55026 (Igor Nikonov).
  • Исправлено простое состояние с типом Nullable #55030 (Pedro Riera).

Релиз ClickHouse 23.8 LTS, 2023-08-31

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

  • Если у динамического диска есть имя, его следует указывать в аргументах функции disk как disk = disk(name = 'disk_name', ...). В предыдущей версии его можно было указывать как disk = disk_<disk_name>(...), что больше не поддерживается. #52820 (Kseniia Sumarokova).
  • clickhouse-benchmark будет устанавливать соединения параллельно, если он запущен с параметром --concurrency больше единицы. Ранее он был практически непригоден к использованию, если вы запускали его с 1000 одновременных соединений из Европы в США. Исправлен расчет QPS для соединений с высокой задержкой. Обратное несовместимое изменение: опция вывода clickhouse-benchmark в формате JSON удалена. Если вы использовали эту опцию, в качестве обходного решения вы можете извлекать данные из system.query_log в формате JSON. #53293 (Alexey Milovidov).
  • Столбец microseconds удален из system.text_log, а столбец milliseconds удален из system.metric_log, поскольку они избыточны при наличии столбца event_time_microseconds. #53601 (Alexey Milovidov).
  • Механизм кэширования метаданных объявлен устаревшим. Он является экспериментальным, и мы никогда его не использовали. Механизм опасен: #51182. Удалена системная таблица system.merge_tree_metadata_cache. Кэш метаданных все еще доступен в этой версии, но вскоре будет удален. Это закрывает #39197. #51303 (Alexey Milovidov).
  • Отключена поддержка 3DES в TLS-соединениях. #52893 (Kenji Noguchi).

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

  • Прямой импорт из архивов форматов zip/7z/tar. Пример: file('*.zip :: *.csv'). #50321 (nikitakeba).
  • Добавлен столбец ptr в system.trace_log для trace_type = 'MemorySample'. Этот столбец содержит адрес выделенной памяти. Добавлена функция flameGraph, которая может строить flamegraph с информацией о выделенной и не освобождённой памяти. Доработка #38391. #45322 (Nikolai Kochetov).
  • Добавлена табличная функция azureBlobStorageCluster. Набор поддерживаемых возможностей во многом аналогичен табличной функции s3Cluster. #50795 (SmitaRKulkarni).
  • Разрешено использовать cluster, clusterAllReplicas, remote и remoteSecure без указания имени таблицы (см. задачу #50808). #50848 (Yangkuan Liu).
  • Системная таблица для мониторинга потребителей в Kafka. #50999 (Ilya Golshtein).
  • Добавлена настройка max_sessions_for_user. #51724 (Alexey Gerasimchuck).
  • Новые функции toUTCTimestamp/fromUTCTimestamp, аналогичные функциям Spark to_utc_timestamp/from_utc_timestamp. #52117 (KevinyhZou).
  • Добавлены новые функции structureToCapnProtoSchema/structureToProtobufSchema, которые преобразуют структуру таблицы ClickHouse в схему формата CapnProto/Protobuf. Эти функции позволяют выполнять ввод/вывод данных в формате CapnProto/Protobuf без внешней схемы формата, используя автоматически сгенерированную схему на основе структуры таблицы (управляется настройками format_capn_proto_use_autogenerated_schema/format_protobuf_use_autogenerated_schema). Также они позволяют экспортировать автоматически сгенерированную схему при вводе/выводе данных с помощью настройки output_format_schema. #52278 (Kruglov Pavel).
  • Новое поле query_cache_usage в system.query_log теперь показывает, использовался ли кеш запросов и каким образом. #52384 (Robert Schulze).
  • Добавлены новые функции startsWithUTF8 и endsWithUTF8. #52555 (李扬).
  • Разрешено использование переменного числа столбцов в TSV/CustomSeparated/JSONCompactEachRow, определение схемы теперь работает с переменным числом столбцов. Добавлены настройки input_format_tsv_allow_variable_number_of_columns, input_format_custom_allow_variable_number_of_columns, input_format_json_compact_allow_variable_number_of_columns. #52692 (Kruglov Pavel).
  • Добавлены запросы SYSTEM STOP/START PULLING REPLICATION LOG (для тестирования ReplicatedMergeTree). #52881 (Alexander Tokmakov).
  • Разрешено выполнение константных недетерминированных функций в мутациях на сервере-инициаторе. #53129 (Anton Popov).
  • Добавлен формат ввода One, который не читает данные и всегда возвращает одну строку со столбцом dummy типа UInt8 и значением 0, как system.one. Его можно использовать совместно с виртуальными столбцами _file/_path для перечисления файлов в табличных функциях file/s3/url/hdfs/etc без чтения данных. #53209 (Kruglov Pavel).
  • Добавлена функция tupleConcat. Закрывает #52759. #53239 (Nikolay Degterinsky).
  • Добавлена поддержка операции TRUNCATE DATABASE. #53261 (Bharat Nallan).
  • Добавлена настройка max_threads_for_indexes для ограничения числа потоков, используемых при обработке первичного ключа. #53313 (jorisgio).
  • Снова добавлены функции SipHash с ключом. #53525 (Salvatore Mesoraca).
  • (#52755, #52895) Добавлены функции arrayRotateLeft, arrayRotateRight, arrayShiftLeft, arrayShiftRight. #53557 (Mikhail Koviazin).
  • Добавлен столбец name в таблицу system.clusters в качестве псевдонима столбца cluster. #53605 (irenjj).
  • Расширенная панель мониторинга теперь поддерживает массовое редактирование (сохранение/загрузка). #53608 (Alexey Milovidov).
  • В расширенной панели мониторинга теперь можно разворачивать графики на весь экран и менять их расположение. #53622 (Alexey Milovidov).
  • Добавлена поддержка операций сложения и вычитания для массивов: [5,2] + [1,7]. Деление и умножение не были реализованы из-за неоднозначности между покомпонентным (точечным) умножением и скалярным произведением аргументов. Закрывает #49939. #52625 (Yarik Briukhovetskyi).
  • Добавлена поддержка использования строковых литералов в качестве имён таблиц. Закрывает #52178. #52635 (hendrik-m).

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

  • Добавлен новый движок таблицы S3Queue для потокового импорта данных из S3. Закрывает #37012. #49086 (s-kat). Эта функция пока не готова к использованию. Не используйте её.
  • Включено параллельное чтение с реплик по distributed таблице. Связано с #49708. #53005 (Igor Nikonov).
  • Добавлена экспериментальная поддержка HNSW как метода приближённого поиска ближайших соседей. #53447 (Davit Vardanyan). В настоящий момент предназначено для тех, кто продолжает работать над реализацией. Не используйте её.

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

  • Проталкивание фильтра при работе с Parquet (filter pushdown). То есть при чтении файлов Parquet группы строк (фрагменты файла) пропускаются на основе условия WHERE и минимальных/максимальных значений в каждом столбце. В частности, если файл примерно отсортирован по какому-либо столбцу, запросы, которые фильтруют по узкому диапазону значений этого столбца, будут выполняться значительно быстрее. #52951 (Michael Kolupaev).
  • Оптимизировано чтение небольших групп строк за счёт их объединения в пакеты в формате Parquet. Исправляет #53069. #53281 (Kruglov Pavel).
  • Оптимизировано вычисление COUNT по файлам в большинстве форматов входных данных. Закрывает #44334. #53637 (Kruglov Pavel).
  • Перед чтением данных в табличных функциях url/file/hdfs используйте фильтрацию по имени файла/пути. #53529 (Kruglov Pavel).
  • Включена JIT-компиляция для архитектур AArch64, PowerPC, SystemZ и RISC-V. #38217 (Maksim Kita).
  • Добавлена настройка rewrite_count_distinct_if_with_count_distinct_implementation для переписывания выражений countDistinctIf с использованием count_distinct_implementation. Закрывает #30642. #46051 (flynn).
  • Ускорено слияние состояний агрегатных функций uniq и uniqExact за счёт параллельного преобразования перед слиянием. #50748 (Jiebin Sun).
  • Повышена производительность агрегации по строковому ключу типа Nullable при использовании большого числа ключей переменной длины. #51399 (LiuNeng).
  • Добавлен проход в Analyzer для оптимизации временных фильтров с использованием preimage. Результаты экспериментов производительности SSB на устройстве ICX (Intel Xeon Platinum 8380 CPU, 80 ядер, 160 потоков) показывают, что это изменение может улучшить геометрическое среднее по QPS на 8,5% при включённом экспериментальном анализаторе. #52091 (Zhiguo Zhou).
  • Оптимизировано слияние в функции uniqExact (COUNT DISTINCT), когда все хэш‑множества одноуровневые. #52973 (Jiebin Sun).
  • Join table engine: не клонировать хеш-структуру данных соединения целиком (со всеми столбцами). #53046 (Duc Canh Le).
  • Реализован собственный входной формат ORC без использования библиотеки Apache Arrow для повышения производительности. #53324 (李扬).
  • Панель управления будет сообщать серверу, что данные нужно сжимать, что полезно для больших временных интервалов при медленном интернет-соединении. Например, один график с 86400 точками может занимать 1,5 МБ в несжатом виде и 60 КБ в сжатом виде с br. #53569 (Alexey Milovidov).
  • Улучшено использование пула потоков при выполнении операций BACKUP и RESTORE. #53649 (Nikita Mikhaylov).
  • Параллельная загрузка метаданных файлового кэша при запуске. Настраивается параметром конфигурации кэша load_metadata_threads (по умолчанию: 1). Связано с #52037. #52943 (Kseniia Sumarokova).
  • Улучшен move_primary_key_columns_to_end_of_prewhere. #53337 (Han Fei).
  • Это оптимизирует взаимодействие с ClickHouse Keeper. Ранее вызывающий код мог зарегистрировать один и тот же watch callback несколько раз. В этом случае каждая запись потребляла память, и тот же callback вызывался несколько раз, что не имело большого смысла. Чтобы избежать этого, вызывающий код мог добавлять логику, не позволяющую регистрировать один и тот же watch несколько раз. С этим изменением такая дедупликация выполняется автоматически, если watch callback передаётся через shared_ptr. #53452 (Alexander Gololobov).
  • Кэширование количества строк в файлах при выполнении count в функциях file/s3/url/hdfs/azure. Кэш может быть включён или отключён с помощью настройки use_cache_for_count_from_files (по умолчанию включён). Продолжение https://github.com/ClickHouse/ClickHouse/pull/53637. #53692 (Kruglov Pavel).
  • Более тщательное управление потоками повышает скорость работы табличной функции S3 при обработке большого количества файлов более чем на ~25%. #53668 (pufit).

Улучшения

  • Добавлена настройка stderr_reaction для управления реакцией (none, log или throw), когда внешняя команда записывает данные в stderr. Это упрощает отладку внешних команд. #43210 (Amos Bird).
  • Добавлен столбец partition в system part_log и таблицу-объединение. #48990 (Jianfei Hu).
  • Размеры кэшей индекса (несжатых данных и mark-данных), mmap и запросов теперь можно динамически настраивать во время работы сервера (без его перезапуска). #51446 (Robert Schulze).
  • Если словарь создан со сложным ключом, автоматически выбирается вариант компоновки «complex key». #49587 (xiebin).
  • Добавлена настройка use_concurrency_control для улучшенного тестирования нового механизма управления параллелизмом. #49618 (Alexey Milovidov).
  • Добавлены подсказки по исправлению опечаток в названиях баз данных и таблиц. #49801 (Yarik Briukhovetskyi).
  • При чтении небольших файлов из HDFS с помощью Gluten мы обнаружили, что это занимает больше времени по сравнению с непосредственным выполнением запросов в Spark. Мы оптимизировали этот сценарий. #50063 (KevinyhZou).
  • После истечения срока действия сессии появлялось слишком много бесполезных сообщений об ошибках в логах, что нас не устраивало. #50171 (helifu).
  • Добавлены резервные сессии ZooKeeper с ограниченным временем жизни. Исправлен столбец index в system.zookeeper_connection для DNS-адресов. #50424 (Anton Kozlov).
  • Добавлена возможность записывать в лог достижение max_partitions_per_insert_block. #50948 (Sean Haynes).
  • Добавлен набор дополнительных команд в clickhouse-keeper-client (в основном для упрощения отладки ClickHouse). #51117 (pufit).
  • Обновлена проверка строки подключения в табличной функции azureBlobStorage, так как строка подключения с «sas» не всегда начинается с конечной точки по умолчанию, а также обновлён URL подключения: теперь токен «sas» добавляется в URL после контейнера Azure. #51141 (SmitaRKulkarni).
  • Исправлено описание фильтрации множеств в алгоритме JOIN full_sorting_merge. #51329 (Tanay Tummalapalli).
  • Исправлено использование памяти в Aggregator при очень большом значении max_block_size. #51566 (Nikita Taranov).
  • Добавлена команда SYSTEM SYNC FILESYSTEM CACHE. Она сравнивает состояние кэша файловой системы в памяти с состоянием на диске и при необходимости исправляет состояние в памяти. Она требуется только в случае ручного вмешательства в данные на диске, что крайне не рекомендуется. #51622 (Kseniia Sumarokova).
  • Попытка реализовать универсальный proxy resolver для ClickHouse при сохранении обратной совместимости с существующим proxy resolver для конфигурации хранилища S3. #51749 (Arthur Passos).
  • Добавлена поддержка чтения подстолбцов кортежей из табличных функций file, s3, hdfs, url и azureBlobStorage. #51806 (Kruglov Pavel).
  • Функция arrayIntersect теперь возвращает значения в порядке следования элементов первого аргумента. Закрывает #27622. #51850 (Yarik Briukhovetskyi).
  • Добавлены новые запросы, позволяющие создавать и удалять объекты доступа в указанном хранилище доступа либо переносить объекты доступа из одного хранилища доступа в другое. #51912 (pufit).
  • Сделать так, чтобы запросы ALTER TABLE FREEZE не реплицировались в таблицах с движком Replicated. #52064 (Mike Kot).
  • Добавлена возможность сбрасывать системные таблицы на диск при неожиданном завершении работы. #52174 (Alexey Gerasimchuck).
  • Исправлена ошибка, из-за которой табличная функция s3 не работала с предварительно подписанными URL-адресами. Закрывает #50846. #52310 (chen).
  • Добавлен столбец name — псевдоним столбцов event и metric в таблицах system.events и system.metrics. Закрывает #51257. #52315 (chen).
  • Добавлена поддержка синтаксиса CREATE UNIQUE INDEX в парсере как no-op (операции без действия) для лучшей совместимости с SQL. Индекс UNIQUE не поддерживается. Установите create_index_ignore_unique = 1, чтобы игнорировать ключевое слово UNIQUE в запросах. #52320 (Ilya Yatsishin).
  • Добавлена поддержка использования предопределённых макросов ({database} и {table}) в ряде настроек движка Kafka: topic, consumer, client_id и т. д. #52386 (Yury Bogomolov).
  • Отключено обновление кэша файловой системы во время backup/restore. Кэш файловой системы не должен обновляться при выполнении backup/restore, поскольку, по-видимому, это лишь замедляет процесс без какой-либо выгоды (так как команда BACKUP может читать большие объёмы данных, и нет смысла помещать все данные в кэш файловой системы и сразу же их оттуда вытеснять). #52402 (Vitaly Baranov).
  • Конфигурация S3-эндпоинта позволяет использовать его от корня и при необходимости автоматически добавляет символ '/'. #47809. #52600 (xiaolei565).
  • В clickhouse-local разрешены позиционные аргументы и заполняются глобальные настройки UDF (user_scripts_path и user_defined_executable_functions_config). #52643 (Yakov Olkhovskiy).
  • system.asynchronous_metrics теперь включает метрики «QueryCacheEntries» и «QueryCacheBytes» для проверки кэша запросов. #52650 (Robert Schulze).
  • Добавлена возможность использовать параметр s3_storage_class в предложении SETTINGS оператора BACKUP при создании резервных копий в S3. #52658 (Roman Vasin).
  • Добавлена утилита print-backup-info.py, которая разбирает файл метаданных резервной копии и выводит информацию о ней. #52690 (Vitaly Baranov).
  • Закрывает #49510. В настоящее время имена баз данных и таблиц чувствительны к регистру, но BI‑инструменты выполняют запросы к information_schema то в нижнем регистре, то в верхнем. По этой причине у нас есть база данных information_schema, содержащая таблицы в нижнем регистре, такие как information_schema.tables, и база данных INFORMATION_SCHEMA, содержащая таблицы в верхнем регистре, такие как INFORMATION_SCHEMA.TABLES. Но некоторые инструменты выполняют запросы к INFORMATION_SCHEMA.tables и information_schema.TABLES. Предлагаемое решение — продублировать таблицы и в нижнем, и в верхнем регистре в обеих базах данных information_schema (с именами в нижнем и верхнем регистре). #52695 (Yarik Briukhovetskyi).
  • Запрос CHECK TABLE имеет более высокую производительность и удобен в использовании (отправляет обновления о ходе выполнения, может быть отменён). #52745 (vdimir).
  • Добавлена поддержка modulo, intDiv, intDivOrZero для кортежей за счёт применения этих операций к каждому элементу кортежа. #52758 (Yakov Olkhovskiy).
  • Искать стандартные конфигурации yaml и yml в clickhouse-client после xml. #52767 (Alexey Milovidov).
  • При слиянии с конфигурацией, корневой элемент которой имеет имя, отличное от 'clickhouse', конфигурации с другим именем корневого узла просто пропускались без выбрасывания исключения. #52770 (Yakov Olkhovskiy).
  • Теперь можно задавать минимальный (memory_profiler_sample_min_allocation_size) и максимальный (memory_profiler_sample_max_allocation_size) размеры выделений памяти, которые будут отслеживаться выборочным профилировщиком памяти. #52779 (alesapin).
  • Добавлена настройка precise_float_parsing для переключения методов разбора чисел с плавающей запятой (быстрый/точный). #52791 (Andrey Zvonov).
  • Использовать те же пути по умолчанию для clickhouse-keeper (символической ссылки), как для clickhouse-keeper (исполняемого файла). #52861 (Vitaly Baranov).
  • Улучшено сообщение об ошибке для табличной функции remote. Закрывает #40220. #52959 (jiyoungyoooo).
  • Добавлена возможность указывать пользовательскую политику хранения в секции SETTINGS для запросов RESTORE. #52970 (Victor Krasnov).
  • Добавлена возможность ограничивать частоту запросов к S3 при операциях резервного копирования (теперь команды BACKUP и RESTORE учитывают параметры s3_max_[get/put]_[rps/burst]). #52974 (Daniel Pozo Escalona).
  • Добавлены настройки для игнорирования предложения ON CLUSTER в запросах при управлении реплицируемыми пользовательскими функциями или сущностями управления доступом с реплицируемым хранилищем. #52975 (Aleksei Filatov).
  • Действия EXPLAIN для шага JOIN. #53006 (Maksim Kita).
  • Функции hasTokenOrNull и hasTokenCaseInsensitiveOrNull теперь возвращают null для пустых поисковых строк. #53059 (ltrk2).
  • Добавлена возможность ограничивать допустимые пути для файловых кешей. В основном это полезно для динамических дисков. Если в конфигурации сервера указан filesystem_caches_path, все пути файловых кешей будут ограничены этим каталогом. Например, если path в конфигурации кеша относительный — он будет размещён внутри filesystem_caches_path; если path в конфигурации кеша абсолютный, потребуется, чтобы он находился внутри filesystem_caches_path. Если filesystem_caches_path не указан в конфигурации, поведение будет таким же, как в более ранних версиях. #53124 (Kseniia Sumarokova).
  • Добавлено несколько пользовательских команд (главным образом для упрощения отладки ClickHouse). #53127 (pufit).
  • Добавлена диагностическая информация об имени файла при выводе схемы — это помогает при обработке нескольких файлов с использованием glob-шаблонов. #53135 (Alexey Milovidov).
  • Клиент будет загружать подсказки через основное соединение, если второму соединению запрещено создавать сессию. #53177 (Alexey Gerasimchuck).
  • Добавлено предложение EXCEPT в запрос SYSTEM STOP/START LISTEN QUERIES [ALL/DEFAULT/CUSTOM], например: SYSTEM STOP LISTEN QUERIES ALL EXCEPT TCP, HTTP. #53280 (Nikolay Degterinsky).
  • Изменено значение по умолчанию для max_concurrent_queries со 100 на 1000. Допустимо иметь много одновременных запросов, если они не ресурсоёмкие и в основном ожидают сетевых операций. Примечание: не путайте одновременные запросы с QPS: например, сервер ClickHouse может обрабатывать десятки тысяч QPS при менее чем 100 одновременных запросах. #53285 (Alexey Milovidov).
  • Ограничено количество одновременно выполняющихся фоновых слияний при оптимизации партиций. #53405 (Duc Canh Le).
  • Добавлена настройка allow_moving_table_directory_to_trash, которая позволяет игнорировать ошибку Directory for table data already exists при репликации или восстановлении базы данных Replicated. #53425 (Alexander Tokmakov).
  • Если серверные настройки asynchronous_metrics_update_period_s и asynchronous_heavy_metrics_update_period_s ошибочно установлены в 0, теперь это приведёт к корректному завершению с ошибкой вместо аварийного завершения приложения. #53428 (Robert Schulze).
  • Сервер ClickHouse теперь при перечитывании конфигурации учитывает изменения лимитов памяти, заданных через cgroups. #53455 (Robert Schulze).
  • Добавлена возможность отключить сброс distributed таблиц при выполнении команд DETACH, DROP или при остановке сервера. #53501 (Azat Khuzhin).
  • Функция domainRFC теперь поддерживает IPv6 в квадратных скобках. #53506 (Chen768959).
  • Увеличен таймаут для запросов S3 CopyObject, используемых при создании резервных копий. #53533 (Michael Kolupaev).
  • Добавлена серверная настройка aggregate_function_group_array_max_element_size. Она используется для ограничения размера массива для функции groupArray при сериализации. Значение по умолчанию — 16777215. #53550 (Nikolai Kochetov).
  • SCHEMA был добавлен в качестве псевдонима для DATABASE для повышения совместимости с MySQL. #53587 (Daniël van Eeden).
  • Добавлены асинхронные метрики по таблицам в системной базе данных. Например, TotalBytesOfMergeTreeTablesSystem. Это закрывает #53603. #53604 (Alexey Milovidov).
  • SQL-редактор в интерфейсах Play и Dashboard больше не использует Grammarly. #53614 (Alexey Milovidov).
  • На уровне экспертных настроек теперь можно (1) задавать size_ratio (т. е. относительный размер защищённой очереди) кэшей меток [index] и кэшей несжатых данных, (2) настраивать политику кэширования кэшей меток индекса и кэшей несжатых данных. #53657 (Robert Schulze).
  • Добавлена проверка информации о клиенте в пакет запроса TCPHandler. #53673 (Alexey Gerasimchuck).
  • Повторная загрузка частей при сетевых ошибках во время взаимодействия с Microsoft Azure. #53750 (SmitaRKulkarni).
  • Стек трассировки для исключений, исключения из материализованных представлений пробрасываются. #53766 (Ilya Golshtein).
  • Если имя хоста и порт не указаны, клиент Keeper попытается найти строку подключения в файле config.xml ClickHouse. #53769 (pufit).
  • Добавлено профильное событие PartsLockMicroseconds, которое показывает количество микросекунд, в течение которых удерживается блокировка частей данных в семействе движков таблиц MergeTree. #53797 (alesapin).
  • Сделано настраиваемым ограничение числа попыток переподключения в RAFT для Keeper. Этот параметр позволяет Keeper быстрее восстанавливать соединение с другими узлами, если текущее соединение разорвано. #53817 (Pengyuan Bian).
  • Теперь внешние ключи в определениях таблиц игнорируются для улучшения совместимости с MySQL, чтобы пользователям не приходилось переписывать свои SQL‑запросы, содержащие определения внешних ключей, см. #53380. #53864 (jsc0218).

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

  • Не экспортировать символы из бинарника ClickHouse динамическому компоновщику. Это может исправить #43933. #47475 (Alexey Milovidov).
  • В пакет clickhouse-server добавлена символическая ссылка clickhouse-keeper-client. #51882 (Mikhail f. Shiryaev).
  • Добавлен https://github.com/elliotchance/sqltest в CI для отчётности о соответствии стандарту SQL:2016. #52293 (Alexey Milovidov).
  • Обновлён PRQL до 0.9.3. #53060 (Maximilian Roos).
  • Системные таблицы из проверок CI экспортируются в ClickHouse Cloud. #53086 (Alexey Milovidov).
  • Профильные данные компилятора (-ftime-trace) отправляются в ClickHouse Cloud. #53100 (Alexey Milovidov).
  • Ускорены сборки Debug и Tidy. #53178 (Alexey Milovidov).
  • Ускорена сборка благодаря удалению огромного количества мусора. Один из часто подключаемых заголовочных файлов был «отравлен» Boost. #53180 (Alexey Milovidov).
  • Удалено ещё больше ненужного кода. #53182 (Alexey Milovidov).
  • Функция arrayAUC использовала тяжёлые шаблоны C++, от которых отказались. #53183 (Alexey Milovidov).
  • Некоторые единицы трансляции всегда пересобирались, независимо от ccache. Причина была найдена и устранена. #53184 (Alexey Milovidov).
  • Данные профиля компилятора (-ftime-trace) загружаются в ClickHouse Cloud. Вторая попытка после #53100. #53213 (Alexey Milovidov).
  • Экспорт логов из CI в stateful-тестах в ClickHouse Cloud. #53351 (Alexey Milovidov).
  • Экспорт логов из CI в стресс‑тестах. #53353 (Alexey Milovidov).
  • Экспорт логов из CI в fuzzer. #53354 (Alexey Milovidov).
  • Сохраняются параметры окружения в команде clickhouse start. Исправлена #51962. #53418 (Mikhail f. Shiryaev).
  • Продолжение к #53418. Небольшие улучшения в install_check.py, добавлены тесты для корректной передачи параметров окружения (ENV) в основной процесс при init.d start. #53457 (Mikhail f. Shiryaev).
  • Перестроено управление файлами в CMake, чтобы избежать возможного дублирования. Например, indexHint.cpp дублировался и в dbms_sources, и в clickhouse_functions_sources. #53621 (Amos Bird).
  • Обновлена библиотека Snappy до версии 1.1.10. #53672 (李扬).
  • Незначительно улучшена сборка CMake за счёт приведения в порядок некоторых зависимостей и удаления дубликатов. Каждый коммит включает краткое описание внесённых изменений. #53759 (Amos Bird).

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

  • Не сбрасывать (экспериментальный) индекс Annoy при построении, если имеется более одной метки #51325 (Tian Xinhui).
  • Исправлено использование временных каталогов при операции RESTORE #51493 (Azat Khuzhin).
  • Исправлена работа бинарной арифметики для Nullable(IPv4) #51642 (Yakov Olkhovskiy).
  • Добавлена поддержка типов данных IPv4 и IPv6 в качестве атрибутов словаря #51756 (Yakov Olkhovskiy).
  • Исправлено вычисление контрольной суммы маркеров сжатия #51777 (SmitaRKulkarni).
  • Исправлена ошибка, из-за которой запятая при разборе CSV в режиме best effort ошибочно интерпретировалась как часть значения datetime #51950 (Kruglov Pavel).
  • Не выбрасывать исключение, если исполняемая UDF имеет параметры #51961 (Nikita Taranov).
  • Исправлена ошибка пересчёта skip-индексов и проекций в запросах ALTER DELETE #52530 (Anton Popov).
  • MaterializedMySQL: Исправлен бесконечный цикл в ReadBuffer::read #52621 (Val Doroshchuk).
  • Загружать подсказки только для диалекта clickhouse #52628 (János Benjamin Antal).
  • Создавать и уничтожать канал ares по мере необходимости. #52634 (Arthur Passos).
  • Исправлена фильтрация по виртуальным столбцам при использовании выражения OR #52653 (Azat Khuzhin).
  • Исправлен сбой функции tuple при использовании одного разреженного столбца в качестве аргумента #52659 (Anton Popov).
  • Исправлена работа именованных коллекций в кластере #52687 (Al Korgun).
  • Исправлено избыточное чтение лишнего столбца при многостадийном PREWHERE #52689 (Anton Popov).
  • Исправлен неожиданный результат сортировки по нескольким столбцам с направлением NULLS FIRST #52761 (copperybean).
  • Исправлена гонка данных при перенастройке Keeper #52804 (Antonio Andelic).
  • Исправлена сортировка разреженных столбцов с большим лимитом #52827 (Anton Popov).
  • clickhouse-keeper: исправлена реализация сервера на poll. #52833 (Andy Fiddaman).
  • Теперь анализатор регулярных выражений распознаёт именованные группы захвата #52840 (Han Fei).
  • Исправлено возможное срабатывание assert в ~PushingAsyncPipelineExecutor в clickhouse-local #52862 (Kruglov Pavel).
  • Исправлено чтение пустых значений типа Nested(Array(LowCardinality(...))) #52949 (Anton Popov).
  • Добавлены новые тесты для session_log и исправлена несогласованность между операциями входа в систему и выхода из неё. #52958 (Alexey Gerasimchuck).
  • Исправлена утечка пароля в выводе SHOW CREATE TABLE для таблиц MySQL #52962 (Duc Canh Le).
  • Разреженный формат столбца в CreateSetAndFilterOnTheFlyStep преобразован в полный #53000 (vdimir).
  • Исправлена редкая гонка состояний при удалении каталога с пустым префиксом ключа в fs cache #53055 (Kseniia Sumarokova).
  • Исправлена ошибка, из-за которой ZstdDeflatingWriteBuffer иногда усекал выходные данные #53064 (Michael Kolupaev).
  • Исправлен query_id в part_log при асинхронном выполнении запросов FLUSH #53103 (Raúl Marín).
  • Исправлена возможная ошибка при работе с кешем "Read unexpected size" #53121 (Kseniia Sumarokova).
  • Отключить новый кодировщик Parquet #53130 (Alexey Milovidov).
  • Исправлено исключение «Not-ready Set» #53162 (Nikolai Kochetov).
  • Исправлено экранирование символов в движке PostgreSQL #53250 (Nikolay Degterinsky).
  • Экспериментальная таблица session_log: добавлены новые тесты для session_log и устранено несоответствие между входом в систему и выходом из системы. #53255 (Alexey Gerasimchuck). Устранено несоответствие между успешным входом и выходом из системы #53302 (Alexey Gerasimchuck).
  • Исправлена ошибка при добавлении субсекундных интервалов к DateTime #53309 (Michael Kolupaev).
  • Исправлена ошибка «Context has expired» в словарях #53342 (Alexey Milovidov).
  • Исправлен некорректный формат AST для обычной проекции #53347 (Amos Bird).
  • Запрещено использование настройки use_structure_from_insertion_table_in_table_functions в табличных функциях при выполнении Scalar #53348 (flynn).
  • Исправлена загрузка лениво инициализируемой базы данных при выполнении запроса SELECT к system.table #53372 (SmitaRKulkarni).
  • Исправлена системная таблица system.data_skipping_indices для MaterializedMySQL #53381 (Filipp Ozinov).
  • Исправлена обработка одиночного символа возврата каретки в движке сегментации TSV‑файлов #53407 (Kruglov Pavel).
  • Корректно исправлена обработка ошибки Context has expired #53433 (Michael Kolupaev).
  • Исправлен timeout_overflow_mode при наличии подзапроса в правой части выражения IN #53439 (Duc Canh Le).
  • Исправлено неожиданное поведение в #53152 и #53440 (Zhiguo Zhou).
  • Исправлена ошибка разбора в функции JSON_QUERY, возникавшая, когда путь состоял только из цифр #53470 (KevinyhZou).
  • Исправлен некорректный порядок столбцов для запросов с параллельным FINAL. #53489 (Nikolai Kochetov).
  • Исправлено выполнение SELECT из ReplacingMergeTree с do_not_merge_across_partitions_select_final #53511 (Vasily Nemkov).
  • Сначала при завершении работы сбрасывать очередь асинхронных вставок #53547 (joelynch).
  • Исправлен сбой при выполнении операции JOIN по разреженному столбцу #53548 (vdimir).
  • Исправлено возможное неопределённое поведение (UB) в пропускающем индексе для Set при использовании функций с некорректными аргументами #53559 (Azat Khuzhin).
  • Исправлено возможное неопределённое поведение (UB) в инвертированных индексах (экспериментальная функциональность) #53560 (Azat Khuzhin).
  • Исправление: выражение interpolate использует исходный столбец вместо одноимённого столбца-псевдонима из выражения SELECT. #53572 (Yakov Olkhovskiy).
  • Исправлено количество отброшенных гранул в EXPLAIN PLAN index=1 #53616 (wangxiaobo).
  • Корректно обрабатывать totals и extremes при работе с DelayedSource #53644 (Antonio Andelic).
  • Кэш prepared set в конвейере мутаций зависал #53645 (Nikolai Kochetov).
  • Исправлена ошибка при выполнении мутаций с подстолбцами типа JSON в предикатах запросов UPDATE и DELETE. #53677 (VanDarkholme7).
  • Исправлено filter pushdown для full_sorting_merge join #53699 (vdimir).
  • Попытка исправить ошибку, связанную с NULL::LowCardinality(Nullable(...)) NOT IN #53706 (Andrey Zvonov).
  • Исправлено: sorted distinct для разреженных столбцов #53711 (Igor Nikonov).
  • transform: правильная обработка столбца по умолчанию с несколькими строками #53742 (Salvatore Mesoraca).
  • Исправлен краш фаззера в parseDateTime #53764 (Robert Schulze).
  • MaterializedPostgreSQL: устранено необработанное исключение в getCreateTableQueryImpl #53832 (Kseniia Sumarokova).
  • Исправлена возможная ошибка сегментации памяти при использовании движка PostgreSQL #53847 (Kseniia Sumarokova).
  • Исправлен алиас named_collection_admin #54066 (Kseniia Sumarokova).

Выпуск ClickHouse 23.7, 2023-07-27

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

  • Добавлен тип доступа NAMED COLLECTION (псевдонимы USE NAMED COLLECTION, NAMED COLLECTION USAGE). Этот PR обратно несовместим, поскольку этот тип доступа по умолчанию отключен (так как родительский тип доступа NAMED COLLECTION ADMIN также по умолчанию отключен). Предложено в #50277. Для выдачи прав используйте GRANT NAMED COLLECTION ON collection_name TO user или GRANT NAMED COLLECTION ON * TO user; чтобы иметь возможность выдавать эти права, в конфигурации требуется named_collection_admin (ранее он назывался named_collection_control, поэтому останется как псевдоним). #50625 (Kseniia Sumarokova).
  • Исправлена опечатка в имени столбца system.parts last_removal_attemp_time. Теперь он называется last_removal_attempt_time. #52104 (filimonov).
  • Версия distributed_ddl_entry_format_version по умолчанию увеличена до 5 (включает проброс OpenTelemetry и initial_query_idd). Это не позволит обрабатывать существующие записи для распределённого DDL после downgrade (но учтите, что обычно таких необработанных записей быть не должно). #52128 (Azat Khuzhin).
  • Проверка метаданных проекций выполняется тем же способом, что и проверка обычных метаданных. Это изменение может помешать запуску сервера, если существует таблица с некорректной проекцией. Пример — проекция, которая создала позиционные столбцы в первичном ключе (например, projection p (select * order by 1, 4), что не допускается в первичном ключе таблицы и может вызвать сбой при вставке/слиянии). Удалите такие проекции до обновления. Исправляет #52353. #52361 (Nikolai Kochetov).
  • Экспериментальная функция hashid удалена из‑за ошибки. Качество реализации изначально было сомнительным, и функция так и не вышла из экспериментального статуса. Это закрывает #52406. #52449 (Alexey Milovidov).

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

  • Добавлен движок базы данных Overlay для объединения нескольких баз данных в одну. Добавлен движок базы данных Filesystem для представления каталога в файловой системе в виде набора неявно доступных таблиц с автоматически определяемыми форматами и структурами. Новый движок базы данных S3 предоставляет доступ к хранилищу S3 только для чтения, представляя префикс в виде набора таблиц. Новый движок базы данных HDFS позволяет взаимодействовать с хранилищем HDFS аналогичным образом. #48821 (alekseygolub).
  • Добавлена поддержка использования внешних дисков в Keeper для хранения снапшотов и логов. #50098 (Antonio Andelic).
  • Добавлена поддержка glob-шаблонов с выбором нескольких каталогов ({}). #50559 (Andrey Zvonov).
  • Коннектор Kafka теперь может получать схему Avro из реестра схем с базовой аутентификацией, используя URL-кодированные учетные данные. #49664 (Ilya Golshtein).
  • Добавлена функция arrayJaccardIndex, которая вычисляет коэффициент Жаккара между двумя массивами. #50076 (FFFFFFFHHHHHHH).
  • Добавлен столбец is_obsolete в system.settings и другие аналогичные таблицы. Закрывает #50819. #50826 (flynn).
  • Реализована поддержка зашифрованных элементов в файле конфигурации. Добавлена возможность использовать зашифрованный текст в листовых элементах файла конфигурации. Текст шифруется с помощью кодеков шифрования из раздела <encryption_codecs>. #50986 (Roman Vasin).
  • Алгоритм Grace Hash Join теперь может применяться к операциям FULL и RIGHT JOIN. #49483. #51013 (lgbo).
  • Добавлен запрос SYSTEM STOP LISTEN для более плавного завершения работы. Закрывает #47972. #51016 (Nikolay Degterinsky).
  • Добавлен параметр input_format_csv_allow_variable_number_of_columns. #51273 (Dmitry Kardymon).
  • Еще одна скучная новинка: добавлена функция substring_index, как в Spark или MySQL. #51472 (李扬).
  • Системная таблица jemalloc_bins для отображения статистики по бинам jemalloc. Пример: SELECT *, size * (nmalloc - ndalloc) AS allocated_bytes FROM system.jemalloc_bins WHERE allocated_bytes > 0 ORDER BY allocated_bytes DESC LIMIT 10. Приятной работы. #51674 (Alexander Gololobov).
  • Добавлен формат RowBinaryWithDefaults с дополнительным байтом перед каждым столбцом в качестве флага использования значения столбца по умолчанию. Закрывает #50854. #51695 (Kruglov Pavel).
  • Добавлена настройка default_temporary_table_engine. Аналогична default_table_engine, но для временных таблиц. #51292. #51708 (velavokr).
  • Добавлены новые функции initcap / initcapUTF8, которые преобразуют первую букву каждого слова в верхний регистр, а остальные — в нижний. #51735 (Dmitry Kardymon).
  • CREATE TABLE теперь поддерживает использование синтаксиса PRIMARY KEY при определении столбцов. Столбцы добавляются в первичный индекс в том же порядке, в котором они определены. #51881 (Ilya Yatsishin).
  • Добавлена возможность использовать спецификаторы формата даты и времени в именах файлов журнала и журнала ошибок, как в конфигурационных файлах (теги log и errorlog), так и в параметрах командной строки (--log-file и --errorlog-file). #51945 (Victor Krasnov).
  • В HTTP-заголовки добавлена статистика пикового использования памяти. #51946 (Dmitry Kardymon).
  • Добавлены новые функции hasSubsequence (а также их варианты CaseInsensitive и UTF8) для поиска подпоследовательностей в строках. #52050 (Dmitry Kardymon).
  • Добавлен array_agg в качестве псевдонима groupArray для совместимости с PostgreSQL. Закрывает #52100. ### Запись в документации об изменениях, затрагивающих пользователей. #52135 (flynn).
  • Добавлен псевдоним совместимости any_value для агрегатной функции any. Закрывает #52140. #52147 (flynn).
  • Добавлена агрегатная функция array_concat_agg для совместимости с BigQuery; она является псевдонимом функции groupArrayArray. Закрывает #52139. #52149 (flynn).
  • Добавлен OCTET_LENGTH в качестве псевдонима для length. Закрывает #52153. #52176 (FFFFFFFHHHHHHH).
  • Добавлена функция firstLine для извлечения первой строки из многострочной строки. Тем самым закрывается задача #51172. #52209 (Mikhail Koviazin).
  • Реализовано форматирование в стиле KQL для типа данных Interval. Это требуется только для совместимости с языком запросов Kusto. #45671 (ltrk2).
  • Добавлен запрос SYSTEM FLUSH ASYNC INSERT QUEUE, который выполняет все ожидающие асинхронные вставки в целевые таблицы. Добавлена серверная настройка async_insert_queue_flush_on_shutdown (true по умолчанию), которая определяет, следует ли при корректном завершении работы выполнять сброс очереди асинхронных вставок. Настройка async_insert_threads теперь является серверной настройкой. #49160 (Anton Popov).
  • Псевдонимы current_database и новая функция current_schemas для совместимости с PostgreSQL. #51076 (Pedro Riera).
  • Добавлены псевдонимы для функций today (теперь также доступна под именами curdate/current_date) и now (current_timestamp). #52106 (Lloyd-Pottiger).
  • Добавлена поддержка async_deduplication_token для асинхронной вставки. #52136 (Han Fei).
  • Добавлена новая настройка disable_url_encoding, которая позволяет отключить кодирование и декодирование пути в URI в движке URL. #52337 (Kruglov Pavel).

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

  • Включён автоматический выбор разреженного формата сериализации по умолчанию. Это улучшает производительность. Формат поддерживается начиная с версии 22.1. После этого изменения понижение версии до версий ранее 22.1 может быть невозможно. Понижение версии может потребовать установки параметра ratio_of_defaults_for_sparse_serialization=0.9375 55153. Вы можете отключить использование разреженного формата сериализации, указав параметр ratio_of_defaults_for_sparse_serialization = 1 для ваших таблиц MergeTree. #49631 (Alexey Milovidov).
  • По умолчанию включены настройки move_all_conditions_to_prewhere и enable_multiple_prewhere_read_steps. #46365 (Alexander Gololobov).
  • Улучшена производительность некоторых запросов за счет настройки аллокатора. #46416 (Azat Khuzhin).
  • Теперь в MergeTreePrefetchedReadPool, как и в MergeTreeReadPool, используются задачи фиксированного размера. Кроме того, теперь для запросов к S3 используется пул подключений. #49732 (Nikita Taranov).
  • Более агрессивное проталкивание вычислений на правую сторону JOIN. #50532 (Nikita Taranov).
  • Улучшена операция grace_hash join за счёт предварительного резервирования памяти под хеш-таблицу (повторная отправка). #50875 (lgbo).
  • Ожидание блокировки в OpenedFileCache иногда могло заметно сказываться на производительности. Мы разделили его на несколько подотображений (каждое со своей собственной блокировкой), чтобы избежать конкуренции за блокировки. #51341 (Nikita Taranov).
  • Переместить условия со столбцами первичного ключа в конец цепочки PREWHERE. Идея состоит в том, что такие условия, скорее всего, будут использоваться при анализе PK и почти не повлияют на дополнительную фильтрацию в PREWHERE. #51958 (Alexander Gololobov).
  • Ускорена операция COUNT(DISTINCT) для строкового типа String за счёт встраивания (inlining) SipHash. Результаты экспериментов производительности набора OnTime на устройстве ICX (процессор Intel Xeon Platinum 8380, 80 ядер, 160 потоков) показывают, что это изменение может повысить QPS запроса Q8 на 11,6% без влияния на другие запросы. #52036 (Zhiguo Zhou).
  • По умолчанию теперь включена настройка allow_vertical_merges_from_compact_to_wide_parts. Это позволяет сократить использование памяти во время слияний. #52295 (Alexey Milovidov).
  • Исправлен некорректный анализ PROJECTION, который делал первичные ключи недействительными. Эта проблема возникает только при query_plan_optimize_primary_key = 1, query_plan_optimize_projection = 1. Исправляет #48823. Исправляет #51173. #52308 (Amos Bird).
  • Уменьшено количество системных вызовов в FileCache::loadMetadata, что ускоряет запуск сервера, если настроен кэш файловой системы. #52435 (Raúl Marín).
  • Позволяет задать жёсткую нижнюю границу для размера сегмента файла за счёт скачивания оставшихся данных в фоновом режиме. Минимальный размер сегмента файла (если фактический размер файла больше) настраивается параметром конфигурации кэша boundary_alignment, по умолчанию 4Mi. Количество фоновых потоков настраивается параметром конфигурации кэша background_download_threads, по умолчанию 2. Также max_file_segment_size был увеличен с 8Mi до 32Mi в этом PR. #51000 (Kseniia Sumarokova).
  • Уменьшены значения таймаутов по умолчанию для S3 с 30 секунд до 3 секунд, а для других HTTP-запросов ‒ со 180 секунд до 30 секунд. #51171 (Michael Kolupaev).
  • Добавлена новая настройка merge_tree_determine_task_size_by_prewhere_columns. Если установлена в значение true, при определении размера задачи чтения будут учитываться только размеры столбцов, указанных в секции PREWHERE. В противном случае учитываются размеры всех столбцов из запроса. #52606 (Nikita Taranov).

Улучшения

  • Используйте read_bytes/total_bytes_to_read для индикатора прогресса в табличных функциях S3/file/url/... для более точного отображения хода выполнения. #51286 (Kruglov Pavel).
  • Добавлена табличная настройка wait_for_unique_parts_send_before_shutdown_ms, которая задаёт время ожидания, в течение которого реплика будет ждать перед закрытием межсерверного обработчика, отвечающего за реплицируемые отправки. Также устранена несогласованность при завершении работы таблиц и межсерверных обработчиков: теперь сервер сначала отключает таблицы и только после этого завершает работу межсерверных обработчиков. #51851 (alesapin).
  • Разрешено использование стандартного для SQL FETCH без OFFSET. См. https://antonz.org/sql-fetch/. #51293 (Alexey Milovidov).
  • Добавлена возможность фильтровать HTTP‑заголовки для табличных функций URL/S3 с помощью нового раздела конфигурации http_forbid_headers. Поддерживаются как точное совпадение, так и фильтры на основе регулярных выражений. #51038 (Nikolay Degterinsky).
  • Сообщения о 16 EiB свободного места больше не выводятся в логах, так как они бессмысленны. Закрывает #49320. #49342 (Alexey Milovidov).
  • Теперь лимит для функции sleepEachRow корректно проверяется. Добавлена настройка function_sleep_max_microseconds_per_block. Она нужна для универсального фаззера запросов. #49343 (Alexey Milovidov).
  • Исправлены две ошибки в функциях geoHash. #50066 (李扬).
  • Записывать в журнал запросы сброса асинхронных вставок в system.query_log. #51160 (Raúl Marín).
  • Функции date_diff и age теперь поддерживают единицы измерения миллисекунд и микросекунд и работают с точностью до микросекунд. #51291 (Dmitry Kardymon).
  • Улучшен разбор пути в clickhouse-keeper-client. #51359 (Azat Khuzhin).
  • Сторонний продукт, зависящий от ClickHouse (Gluten: плагин, вдвое ускоряющий выполнение Spark SQL), содержал ошибку. Это исправление предотвращает переполнение кучи в этом стороннем продукте при чтении из HDFS. #51386 (李扬).
  • Добавлена возможность отключать нативное копирование для S3 (настройка для BACKUP/RESTORE allow_s3_native_copy и s3_allow_native_copy для дисков s3/s3_plain). #51448 (Azat Khuzhin).
  • Добавлен столбец primary_key_size в таблицу system.parts для отображения сжатого размера первичного ключа на диске. Закрывает #51400. #51496 (Yarik Briukhovetskyi).
  • Разрешён запуск clickhouse-local без procfs, при отсутствии домашнего каталога и без плагинов разрешения имён из glibc. #51518 (Alexey Milovidov).
  • Добавлен плейсхолдер %a, представляющий полное имя файла, в настройку rename_files_after_processing. #51603 (Kruglov Pavel).
  • Добавлен столбец modification_time в таблицу system.parts_columns. #51685 (Azat Khuzhin).
  • Добавлена новая настройка input_format_csv_use_default_on_bad_values для формата CSV, которая позволяет вставлять значение по умолчанию при ошибке парсинга отдельного поля. #51716 (KevinyhZou).
  • Добавлен сброс журнала сбоев на диск после непредвиденного сбоя. #51720 (Alexey Gerasimchuck).
  • Исправлено поведение страницы дашборда, из-за которого ошибки, не связанные с аутентификацией, не отображались. Также исправлено поведение диаграммы с «перекрытием». #51744 (Zach Naimon).
  • Добавлена возможность конвертации UUID в UInt128. #51765 (Dmitry Kardymon).
  • Добавлена поддержка функции range для аргументов типа Nullable. #51767 (Dmitry Kardymon).
  • Условия вида toyear(x) = c преобразуются в c1 <= x < c2. #51795 (Han Fei).
  • Улучшена совместимость оператора SHOW INDEX с MySQL. #51796 (Robert Schulze).
  • Исправлена проблема, из-за которой use_structure_from_insertion_table_in_table_functions не работала со столбцами MATERIALIZED и ALIAS. Закрывает #51817. Закрывает #51019. #51825 (flynn).
  • Кэшируемый словарь теперь запрашивает у источника только уникальные ключи. Закрывает #51762. #51853 (Maksim Kita).
  • Исправлена проблема, из-за которой настройки не применялись для запроса EXPLAIN при указании FORMAT. #51859 (Nikita Taranov).
  • Добавлена возможность указывать SETTINGS перед FORMAT в запросе DESCRIBE TABLE для совместимости с запросами SELECT. Закрывает #51544. #51899 (Nikolay Degterinsky).
  • Целые числа в кодировке Var-Int (например, используемые нативным протоколом) теперь могут использовать полный 64-битный диапазон. Сторонним клиентам рекомендуется обновить свою реализацию Var-Int соответствующим образом. #51905 (Robert Schulze).
  • Сертификаты обновляются при их изменении, без необходимости вручную выполнять SYSTEM RELOAD CONFIG. #52030 (Mike Kot).
  • Добавлена настройка allow_create_index_without_type, которая позволяет игнорировать запросы ADD INDEX без указанного TYPE. Стандартные SQL-запросы просто будут успешно выполняться без изменения схемы таблицы. #52056 (Ilya Yatsishin).
  • Сообщения лога записываются в system.text_log с момента запуска сервера. #52113 (Dmitry Kardymon).
  • Если HTTP-эндпоинт резолвится в несколько IP-адресов и первый из них недоступен, возникало исключение по таймауту. Реализовано создание сессии с обработкой всех разрешённых адресов. #52116 (Aleksei Filatov).
  • Входной формат Avro теперь поддерживает Union, даже если он содержит только один тип. Закрыта задача #52131. #52137 (flynn).
  • Добавлена настройка optimize_use_implicit_projections для отключения неявных проекций (на данный момент — только проекции min_max_count). #52152 (Amos Bird).
  • Раньше можно было использовать функцию hasToken для организации бесконечного цикла. Теперь такой сценарий недоступен. Это закрывает #52156. #52160 (Alexey Milovidov).
  • Оптимистично создавать родительские узлы ZK. #52195 (Raúl Marín).
  • Исправление #50582. Позволяет избежать ошибки Not found column ... in block в некоторых случаях упорядоченного чтения и при работе с константами. #52259 (Chen768959).
  • Проверять геопримитивы S2 на некорректность как можно раньше на стороне ClickHouse. Это закрывает задачу: #27090. #52260 (Nikita Mikhaylov).
  • Добавлена обратно отсутствовавшая проекция QueryAccessInfo при query_plan_optimize_projection = 1. Исправляет #50183. Исправляет #50093. #52327 (Amos Bird).
  • Когда ZooKeeperRetriesControl повторно пробрасывает исключение, полезнее видеть его исходный стек вызовов, а не тот, который относится к самому ZooKeeperRetriesControl. #52347 (Vitaly Baranov).
  • Ожидать блокировку репликации с нулевым копированием данных, даже если некоторые диски её не поддерживают. #52376 (Raúl Marín).
  • Теперь межсерверный порт будет закрываться только после остановки таблиц. #52498 (alesapin).

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

  • Запись файлов parquet стала в 10 раз быстрее, теперь она многопоточная. Скорость почти такая же, как при чтении. #49367 (Michael Kolupaev). Это контролируется настройкой output_format_parquet_use_custom_encoder, которая по умолчанию отключена, так как функциональность пока не идеальна.
  • Добавлена поддержка PRQL в качестве языка запросов. #50686 (János Benjamin Antal).
  • Теперь можно задавать имя для настраиваемых дисков. Ранее настраиваемые диски использовали внутреннее автоматически сгенерированное имя. Теперь это можно сделать с помощью disk = disk_<name>(...) (например, диск будет иметь имя name). #51552 (Kseniia Sumarokova). В этом релизе этот синтаксис может измениться.
  • (experimental MaterializedMySQL) Исправлен сбой при использовании mysqlxx::Pool::Entry после отключения соединения. #52063 (Val Doroshchuk).
  • (experimental MaterializedMySQL) CREATE TABLE ... AS SELECT .. теперь поддерживается в MaterializedMySQL. #52067 (Val Doroshchuk).
  • (experimental MaterializedMySQL) Введено автоматическое преобразование текстовых типов в utf8 для MaterializedMySQL. #52084 (Val Doroshchuk).
  • (experimental MaterializedMySQL) Теперь в DDL для MaterializedMySQL поддерживаются строки UTF-8 без кавычек. #52318 (Val Doroshchuk).
  • (experimental MaterializedMySQL) Теперь в MaterializedMySQL поддерживаются комментарии в двойных кавычках. #52355 (Val Doroshchuk).
  • Обновлен Intel QPL с v1.1.0 до v1.2.0. 2. Обновлен Intel accel-config с v3.5 до v4.0. 3. Исправлена проблема, при которой промах Device IOTLB существенно снижал производительность ускорителей IAA. #52180 (jasperzhu).
  • Настройка session_timezone (новая в версии 23.6) переведена в разряд экспериментальных. #52445 (Alexey Milovidov).
  • Поддержка команды ZooKeeper reconfig для ClickHouse Keeper с инкрементальной реконфигурацией, которую можно включить с помощью настройки keeper_server.enable_reconfiguration. Поддерживается добавление серверов, удаление серверов и изменение приоритетов серверов. #49450 (Mike Kot). Предполагается, что эта функциональность реализована не полностью.

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

  • Добавлены экспериментальные сборки ClickHouse для Linux RISC-V 64 в CI. #31398 (Alexey Milovidov).
  • Добавлена проверка интеграционных тестов при включённом Analyzer. #50926 #52210 (Dmitry Novik).
  • Воспроизводимые сборки для Rust. #52395 (Azat Khuzhin).
  • Обновлены зависимости Cargo. #51721 (Raúl Marín).
  • Функция CHColumnToArrowColumn::fillArrowArrayWithArrayColumnData доработана для работы с nullable-массивами, которые невозможны в ClickHouse, но нужны для Gluten. #52112 (李扬).
  • Мы обновили библиотеку CCTZ до актуального master, но изменений, заметных пользователям, нет. #52124 (Alexey Milovidov).
  • Таблица system.licenses теперь включает библиотеку Poco, которая была жёстко форкнута. Это закрывает задачу #52066. #52127 (Alexey Milovidov).
  • Добавлена проверка на случаи некорректной пунктуации: пробел перед запятой, как в Hello ,world вместо Hello, world. #52549 (Alexey Milovidov).

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

  • Исправлена syncTables в MaterializedPostgreSQL #49698 (Kseniia Sumarokova).
  • Исправлена работа PROJECTION с optimize_aggregators_of_group_by_keys #49709 (Amos Bird).
  • Исправлено поведение optimize_skip_unused_shards при использовании JOIN #51037 (Azat Khuzhin).
  • Исправлена работа функции formatDateTime() с отрицательными дробными значениями типа DateTime64 #51290 (Dmitry Kardymon).
  • Функции hasToken* работали полностью некорректно. Добавлен тест для #43358 #51378 (Alexey Milovidov).
  • Исправлена ошибка в оптимизации переноса функций перед сортировкой. #51481 (Nikolai Kochetov).
  • Исправлено несоответствие структуры Block в Pipe::unitePipes при использовании FINAL #51492 (Nikita Taranov).
  • Исправлен SIGSEGV для кластеров, у которых во всех сегментах нулевой вес (исправляет INSERT INTO FUNCTION clusterAllReplicas()) #51545 (Azat Khuzhin).
  • Исправлен таймаут для хеджированных запросов #51582 (Azat Khuzhin).
  • Исправлена логическая ошибка при ANTI JOIN с NULL-значениями #51601 (vdimir).
  • Исправление проблемы с переносом условий 'IN' в PREWHERE #51610 (Alexander Gololobov).
  • Не применять оптимизатор PredicateExpressionsOptimizer для соединений ASOF/ANTI #51633 (vdimir).
  • Исправлена проблема с асинхронной вставкой с дедупликацией для ReplicatedMergeTree при использовании алгоритмов слияния #51676 (Antonio Andelic).
  • Исправлена ошибка чтения из пустого столбца в parseSipHashKey #51804 (Nikita Taranov).
  • Исправлена ошибка сегментации при создании недопустимой таблицы EmbeddedRocksdb #51847 (Duc Canh Le).
  • Исправлены операции вставки в таблицы MongoDB #51876 (Nikolay Degterinsky).
  • Исправлена взаимная блокировка при остановке DatabaseCatalog #51908 (Alexander Tokmakov).
  • Исправлена ошибка в операторах подзапросов #51922 (Alexey Milovidov).
  • Исправлено асинхронное подключение к хостам с несколькими IP-адресами #51934 (Kruglov Pavel).
  • Не удалять входы после вызова ActionsDAG::merge #51947 (Nikolai Kochetov).
  • Проверять refcount в RemoveManyObjectStorageOperation::finalize вместо execute #51954 (vdimir).
  • Разрешены параметризуемые UDF #51964 (Alexey Milovidov).
  • Небольшое исправление работы toDateTime64() с датами после 2283-12-31 #52130 (Andrey Zvonov).
  • Исправлен ORDER BY для кортежа WINDOW-функций #52145 (Alexey Milovidov).
  • Исправлен некорректный анализ проекций, когда агрегатное выражение содержит монотонные функции #52151 (Amos Bird).
  • Исправлена ошибка в функциях groupArrayMoving #52161 (Alexey Milovidov).
  • Отключено прямое соединение для диапазонных словарей #52187 (Duc Canh Le).
  • Исправлен тест на «липкие» мутации (и крайне редкое состояние гонки) #52197 (alesapin).
  • Устранена гонка в Web-диске #52211 (Kseniia Sumarokova).
  • Исправлена гонка данных в Connection::setAsyncCallback, возникавшая при обработке неизвестного пакета от сервера #52219 (Kruglov Pavel).
  • Исправлено удаление временных данных при запуске, добавлен тест #52275 (vdimir).
  • Не используйте проекции minmax_count для подсчёта столбцов с типом Nullable #52297 (Amos Bird).
  • MergeTree/ReplicatedMergeTree должны использовать часовой пояс сервера для записей в журнал #52325 (Azat Khuzhin).
  • Исправлена работа параметризованного представления с CTE при многократном использовании #52328 (SmitaRKulkarni).
  • Отключены шаблоны выражений для временных интервалов #52335 (Alexander Tokmakov).
  • Исправлена функция apply_snapshot в Keeper #52358 (Antonio Andelic).
  • Обновлён файл build-osx.md #52377 (AlexBykovski).
  • Исправлено зависание countSubstrings при пустой подстроке needle и столбцовом haystack #52409 (Sergei Trifonov).
  • Исправлена работа обычной проекции с таблицами Merge #52432 (Amos Bird).
  • Исправлена потенциальная ошибка двойного освобождения памяти в Aggregator #52439 (Nikita Taranov).
  • Исправлена ошибка вставки в движок Buffer #52440 (Vasily Nemkov).
  • Реализация AnyHash не соответствовала спецификации. #52448 (Alexey Milovidov).
  • Проверка глубины рекурсии в OptimizedRegularExpression #52451 (Alexey Milovidov).
  • Исправлена гонка данных в методах DatabaseReplicated::startupTables()/canExecuteReplicatedMetadataAlter() #52490 (Azat Khuzhin).
  • Исправлено аварийное завершение работы функции transform #52513 (Alexey Milovidov).
  • Исправлена работа легковесного удаления после удаления проекции #52517 (Anton Popov).
  • Исправлена возможная ошибка «Cannot drain connections: cancel first» #52585 (Pavel Kruglov).

Выпуск ClickHouse 23.6, 2023-06-29

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

  • Удалена функциональность do_not_evict_index_and_mark_files в fs-кэше. Эта функциональность только ухудшала ситуацию. #51253 (Kseniia Sumarokova).
  • Удалена поддержка ALTER для экспериментального LIVE VIEW. #51287 (Alexey Milovidov).
  • Значения по умолчанию для http_max_field_value_size и http_max_field_name_size уменьшены до 128 KiB. #51163 (Mikhail f. Shiryaev).
  • Метрики CGroups, связанные с CPU, заменены одной метрикой CGroupMaxCPU для удобства использования. Метрики использования CPU Normalized будут нормализоваться по лимитам CGroups вместо общего количества CPU, когда они заданы. Это закрывает #50836. #50835 (Alexey Milovidov).

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

  • Функция transform, а также CASE с сопоставлением по значению теперь поддерживают все типы данных, что закрывает задачи #29730, #32387, #50827, #31336 и #40493. #51351 (Alexey Milovidov).
  • Добавлена опция --rename_files_after_processing <pattern>. Это закрывает задачу #34207. #49626 (alekseygolub).
  • Добавлена поддержка модификатора TRUNCATE в предложении INTO OUTFILE. Рекомендуется использовать APPEND или TRUNCATE для INTO OUTFILE, если файл уже существует. #50950 (alekar).
  • Добавлен движок таблицы Redis и табличная функция redis. Это позволяет выполнять запросы к внешним серверам Redis. #50150 (JackyWoo).
  • Добавлена возможность пропускать пустые файлы в табличных функциях file/s3/url/hdfs с помощью настроек s3_skip_empty_files, hdfs_skip_empty_files, engine_file_skip_empty_files, engine_url_skip_empty_files. #50364 (Kruglov Pavel).
  • Добавлена новая настройка use_mysql_types_in_show_columns для изменения SQL‑оператора SHOW COLUMNS так, чтобы он отображал эквивалентные типы MySQL, когда клиент подключён через порт совместимости с MySQL. #49577 (Thomas Panetti).
  • Теперь clickhouse-client можно вызывать с помощью строки подключения вместо параметров "--host", "--port", "--user" и т. д. #50689 (Alexey Gerasimchuck).
  • Добавлена настройка session_timezone; она используется как часовой пояс по умолчанию для сессии, если явно не указан другой. #44149 (Andrey Zvonov).
  • Кодек DEFLATE_QPL теперь управляется серверной настройкой "enable_deflate_qpl_codec" (по умолчанию: false) вместо настройки "allow_experimental_codecs". Это означает, что DEFLATE_QPL больше не считается экспериментальным. #50775 (Robert Schulze).

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

  • Улучшено планирование задач выбора слияний и очистки в ReplicatedMergeTree. Задачи не будут выполняться слишком часто, когда нет данных для слияния или очистки. Добавлены настройки max_merge_selecting_sleep_ms, merge_selecting_sleep_slowdown_factor, max_cleanup_delay_period и cleanup_thread_preferred_points_per_iteration. Это должно закрыть #31919. #50107 (Alexander Tokmakov).
  • Реализовано проталкивание фильтра (filter push down) через CROSS JOIN. #50605 (Han Fei).
  • Улучшена производительность при включённом QueryProfiler за счёт использования thread-local timer_id вместо глобального объекта. #48778 (Jiebin Sun).
  • Переписан формат ввода/вывода CapnProto для улучшения его производительности. Имена столбцов и поля CapnProto сопоставляются без учёта регистра, исправлено чтение/запись полей вложенных структур. #49752 (Kruglov Pavel).
  • Оптимизирована производительность записи Parquet для параллельных потоков. #50102 (Hongbin Ma).
  • Отключён parallelize_output_from_storages для обработки materialized view (MATERIALIZED VIEW) и хранилищ только с одним блоком. #50214 (Azat Khuzhin).
  • Влит PR #46558. Избегается перестановка блоков при сортировке, если блок уже отсортирован. #50697 (Alexey Milovidov, Maksim Kita).
  • Выполнение нескольких запросов на получение списка (list requests) к ZooKeeper в параллель для ускорения чтения из таблицы system.zookeeper. #51042 (Alexander Gololobov).
  • Ускорена инициализация lookup-таблиц DateTime для часовых поясов. Это должно сократить время запуска/подключения clickhouse-client, особенно в debug-сборке, так как она довольно тяжёлая. #51347 (Alexander Gololobov).
  • Исправлено снижение производительности озёр данных из-за синхронных запросов HEAD (относящихся к медленной работе Iceberg/Deltalake/Hudi при большом количестве файлов). #50976 (Kseniia Sumarokova).
  • Не выполняется чтение всех столбцов из правой таблицы GLOBAL JOIN. #50721 (Nikolai Kochetov).

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

  • Добавлена поддержка параллельных реплик в анализаторе. #50441 (Raúl Marín).
  • Добавлена случайная пауза (sleep) перед выполнением крупных слияний/мутаций, чтобы распределять нагрузку более равномерно между репликами в случае репликации без копирования. #51282 (alesapin).
  • Запросы ALTER PARTITION и мутации больше не реплицируются через базу данных Replicated, если она содержит только один сегмент, а лежащая в основе таблица — ReplicatedMergeTree. #51049 (Alexander Tokmakov).

Улучшения

  • Ослаблены пороговые значения для «слишком большого количества частей», чтобы соответствовать современным требованиям. Вернули backpressure для длительно выполняющихся запросов INSERT. #50856 (Alexey Milovidov).
  • Добавлена возможность приводить IPv6-адрес к IPv4-адресу для CIDR ::ffff:0:0/96 (IPv4-mapped addresses). #49759 (Yakov Olkhovskiy).
  • Обновлён протокол MongoDB, теперь поддерживаются версии MongoDB 5.1 и новее. Поддержка версий со старым протоколом (<3.6) сохранена. Закрыты #45621, #49879. #50061 (Nikolay Degterinsky).
  • Добавлена настройка input_format_max_bytes_to_read_for_schema_inference для ограничения числа байт, считываемых при определении схемы. Закрывает #50577. #50592 (Kruglov Pavel).
  • При определении схемы учитывать настройку input_format_null_as_default. #50602 (Kruglov Pavel).
  • Добавлена возможность пропускать завершающие пустые строки в форматах CSV/TSV/CustomSeparated с помощью настроек input_format_csv_skip_trailing_empty_lines, input_format_tsv_skip_trailing_empty_lines и input_format_custom_skip_trailing_empty_lines (по умолчанию отключено). Закрывает #49315. #50635 (Kruglov Pavel).
  • Функции «toDateOrDefault|OrNull» и «accuateCast[OrDefault|OrNull]» теперь корректно интерпретируют числовые аргументы. #50709 (Dmitry Kardymon).
  • Добавлена поддержка CSV с разделителями полей — пробелом или \t; эти разделители поддерживаются в Spark. #50712 (KevinyhZou).
  • Параметры number_of_mutations_to_delay и number_of_mutations_to_throw теперь по умолчанию включены со значениями 500 и 1000 соответственно. #50726 (Anton Popov).
  • Панель мониторинга корректно отображает отсутствующие значения. Исправление закрывает #50831. #50832 (Alexey Milovidov).
  • Добавлена возможность использовать аргументы даты и времени в формате временной метки syslog в функциях parseDateTimeBestEffort* и parseDateTime64BestEffort*. #50925 (Victor Krasnov).
  • Параметр командной строки «--password» для clickhouse-client теперь можно указывать только один раз. #50966 (Alexey Gerasimchuck).
  • Используйте hash_of_all_files из system.parts для проверки совпадения частей при кластерном резервном копировании. #50997 (Vitaly Baranov).
  • В системной таблице zookeeper_connection столбец connected_time показывает время установления соединения (в стандартном формате), а добавленный столбец session_uptime_elapsed_seconds отображает продолжительность сеанса установленного соединения (в секундах). #51026 (郭小龙).
  • Улучшен индикатор прогресса для табличных функций file/s3/hdfs/url за счет использования размера фрагмента исходных данных и поэтапного подсчета общего объема данных в каждом потоке. Исправлен индикатор прогресса для функций *Cluster. Закрывает #47250. #51088 (Kruglov Pavel).
  • Добавлен total_bytes_to_read в пакет Progress TCP-протокола для улучшения прогресс-бара. #51158 (Kruglov Pavel).
  • Улучшена проверка частей данных на дисках с кэшем файловой системы. #51164 (Anton Popov).
  • Исправлено иногда некорректное значение current_elements_num в кэше файловой системы. #51242 (Kseniia Sumarokova).

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

  • Во встроенный keeper добавлен встроенный keeper-client в отдельный исполняемый файл. #50964 (pufit).
  • Теперь используется актуальная версия LZ4. #50621 (Nikita Taranov).
  • Сервер ClickHouse будет выводить список изменённых настроек при возникновении фатальных ошибок. Это закрывает #51137. #51138 (Alexey Milovidov).
  • Разрешена сборка ClickHouse с clang-17. #51300 (Alexey Milovidov).
  • Проверка SQLancer считается стабильной, так как вызванные ею ошибки были исправлены. Теперь сбои проверки SQLancer будут отражаться как статус завершения проверки с ошибкой. #51340 (Ilya Yatsishin).
  • Огромная команда RUN в Dockerfile разделена на несколько меньших условных блоков. Необходимые инструменты устанавливаются по требованию в том же слое RUN и затем удаляются. Обновление ОС выполняется только один раз в начале. Используется современный способ проверки подписанного репозитория. Базовый образ понижен до ubuntu:20.04 для устранения проблем в более старых версиях Docker. Обновлена версия Go для устранения уязвимостей Go. #51504 (Mikhail f. Shiryaev).

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

  • Корректно отображать статус загрузки исполняемых словарей #48775 (Anton Kozlov).
  • Корректная обработка мутаций индексов пропуска и проекций #50104 (Amos Bird).
  • Очистка логики перемещения частей #50489 (vdimir).
  • Исправлена проблема с обратной совместимостью хеширования IP-типов в агрегатных функциях #50551 (Yakov Olkhovskiy).
  • Исправлена ошибка, из-за которой таблица семейства Log возвращала неверное количество строк после операции TRUNCATE #50585 (flynn).
  • Исправлена ошибка при параллельном слиянии uniqExact #50590 (Nikita Taranov).
  • Откатили недавние изменения в grace hash join #50699 (vdimir).
  • Query Cache: Попытка исправить некорректное приведение типов из ColumnConst к ColumnVector<char8_t> #50704 (Robert Schulze).
  • Исправлена ошибка, из-за которой в Keeper могли сохраняться логи с неизвестной операцией #50751 (Antonio Andelic).
  • Поддержка DateTime64 в SummingMergeTree #50797 (Jordi Villar).
  • Добавлена настройка совместимости с неконстантными часовыми поясами #50834 (Robert Schulze).
  • Исправлено хеширование параметров LDAP в записях кэша #50865 (Julian Maicher).
  • Резервный переход к разбору большого целого числа из String вместо генерации исключения в формате Parquet #50873 (Kruglov Pavel).
  • Исправлена проблема слишком частой проверки файла блокировки при записи резервной копии #50889 (Vitaly Baranov).
  • Не применять проекцию, если включен read-in-order. #50923 (Nikolai Kochetov).
  • Устранена гонка состояний в итераторе Azure Blob Storage #50936 (SmitaRKulkarni).
  • Исправлена ошибочная передача sort_description в CreatingSets #50955 (Nikita Taranov).
  • Исправлена обработка необязательных метаданных Iceberg v2 #50974 (Kseniia Sumarokova).
  • MaterializedMySQL: сохранять скобки в пустых переопределениях таблиц #50977 (Val Doroshchuk).
  • Исправлен сбой в BackupCoordinationStageSync::setError() #51012 (Vitaly Baranov).
  • Исправлена слегка нарушенная реализация механизма copy-on-write для словаря ColumnLowCardinality #51064 (Michael Kolupaev).
  • Генерировать безопасные векторы инициализации (IV) #51086 (Salvatore Mesoraca).
  • Исправлена неэффективная работа кэша запросов для SELECT с подзапросами #51132 (Robert Schulze).
  • Исправлена работа индекса Set при сравнении с константой типа Nullable. #51205 (Nikolai Kochetov).
  • Исправлено падение в функциях s3 и s3Cluster #51209 (Nikolay Degterinsky).
  • Исправлена ошибка, вызывавшая сбой при использовании скомпилированных выражений #51231 (LiuNeng).
  • Исправлена ошибка типа use-after-free в StorageURL при переключении URL #51260 (Michael Kolupaev).
  • Обновлена проверка для параметризованного представления #51272 (SmitaRKulkarni).
  • Исправлена проблема с многократной записью одного и того же файла в резервную копию #51299 (Vitaly Baranov).
  • Исправлен сбой фаззера в ActionsDAG #51301 (Alexey Milovidov).
  • Из функции transform удалён ненужный код #51350 (Alexey Milovidov).

Выпуск ClickHouse 23.5, 2023-06-08

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

  • По умолчанию сжимаются метки и первичный ключ. Это значительно уменьшает время выполнения холодных запросов. Заметки по обновлению: поддержка сжатых меток и первичного ключа была добавлена в версии 22.9. Если вы включили сжатые метки или первичный ключ либо установили версию 23.5 или новее, где сжатые метки или первичный ключ включены по умолчанию, вы не сможете выполнить откат до версии 22.8 или более ранней. Вы также можете явно отключить сжатые метки или первичный ключ, указав настройки compress_marks и compress_primary_key в секции <merge_tree> конфигурационного файла сервера. Заметки по обновлению: если вы обновляетесь с версий до 22.9, вам следует либо обновить все реплики одновременно, либо отключить сжатие перед обновлением, либо обновляться через промежуточную версию, в которой сжатые метки поддерживаются, но не включены по умолчанию, такую как 23.3. #42587 (Alexey Milovidov).
  • Обеспечена согласованная работа локального объектного хранилища с объектным хранилищем S3, исправлена проблема с добавлением (закрывает #48465), локальное хранилище можно настраивать как независимое. Изменение несовместимо с предыдущими версиями, поскольку кэш поверх локального объектного хранилища не совместим с ними. #48791 (Kseniia Sumarokova).
  • Экспериментальная функция "in-memory data parts" удалена. Формат данных по‑прежнему поддерживается, но настройки ничего не делают, и вместо него будут использоваться компактные или широкие части. Это закрывает #45409. #49429 (Alexey Milovidov).
  • Изменены значения по умолчанию настроек parallelize_output_from_storages и input_format_parquet_preserve_order. Это позволяет ClickHouse изменять порядок строк при чтении из файлов (например, CSV или Parquet), что во многих случаях значительно улучшает производительность. Чтобы восстановить прежнее поведение с сохранением порядка, используйте parallelize_output_from_storages = 0, input_format_parquet_preserve_order = 1. #49479 (Michael Kolupaev).
  • Проекции сделали готовыми к использованию в продакшене. Добавлена настройка optimize_use_projections для управления тем, будут ли проекции выбираться для SELECT-запросов. Настройка allow_experimental_projection_optimization устарела и больше ничего не делает. #49719 (Alexey Milovidov).
  • Пометить joinGet как недетерминированную (как и dictGet). Это позволяет использовать их в мутациях без дополнительной настройки. #49843 (Azat Khuzhin).
  • Отменить изменение "groupArray returns cannot be nullable" (из‑за нарушения бинарной совместимости для groupArray/groupArrayLast/groupArraySample над типами Nullable, что, вероятнее всего, приведёт к ошибкам TOO_LARGE_ARRAY_SIZE или CANNOT_READ_ALL_DATA). #49971 (Azat Khuzhin).
  • Настройка enable_memory_bound_merging_of_aggregation_results включена по умолчанию. Если вы обновляетесь с версии до 22.12, мы рекомендуем установить этот флаг в false до завершения обновления. #50319 (Nikita Taranov).

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

  • Добавлен движок хранения AzureBlobStorage и табличная функция azureBlobStorage. Поддерживаемый набор возможностей во многом аналогичен движку/табличной функции S3 [#50604] (https://github.com/ClickHouse/ClickHouse/pull/50604) (alesapin) (SmitaRKulkarni).
  • Добавлен встроенный CLI-клиент ClickHouse Keeper; он доступен как команда clickhouse keeper-client #47414 (pufit).
  • Добавлена табличная функция urlCluster. Выполнен рефакторинг всех табличных функций *Cluster для уменьшения дублирования кода. Автоматический вывод схемы теперь работает для всех возможных сигнатур функций *Cluster и для именованных коллекций. Закрывает #38499. #45427 (attack204), Pavel Kruglov.
  • Кэш запросов теперь можно использовать в производственной среде. #47977 (Robert Schulze). Кэш запросов теперь поддерживает запросы с модификаторами totals и extremes. #48853 (Robert Schulze). Настройка allow_experimental_query_cache помечена как устаревшая для обеспечения обратной совместимости. Она была удалена в https://github.com/ClickHouse/ClickHouse/pull/47977. #49934 (Timur Solodovников).
  • Географические типы данных (Point, Ring, Polygon и MultiPolygon) готовы к промышленной эксплуатации. #50022 (Alexey Milovidov).
  • Добавлено автоматическое определение схемы для движков таблиц PostgreSQL, MySQL, MeiliSearch и SQLite. Закрывает #49972. #50000 (Nikolay Degterinsky).
  • Тип пароля в запросах вида CREATE USER u IDENTIFIED BY 'p' будет автоматически определён согласно настройке default_password_type в config.xml на сервере. Закрывает #42915. #44674 (Nikolay Degterinsky).
  • Добавлен тип аутентификации пароля с использованием bcrypt. Закрывает #34599. #44905 (Nikolay Degterinsky).
  • Добавлено новое ключевое слово INTO OUTFILE 'file.txt' APPEND. #48880 (alekar).
  • Добавлена таблица system.zookeeper_connection, которая показывает информацию о подключениях к Keeper. #45245 (mateng915).
  • Добавлена новая функция generateRandomStructure, которая генерирует случайную структуру таблицы. Её можно использовать совместно с табличной функцией generateRandom. #47409 (Kruglov Pavel).
  • Разрешено использование CASE без ветки ELSE, а также расширена функция transform для работы с большим числом типов. Также исправлены некоторые проблемы, из-за которых transform() возвращал некорректные результаты при смешении десятичных типов с другими числовыми типами. #48300 (Salvatore Mesoraca). Закрывает #2655. Закрывает #9596. Закрывает #38666.
  • Добавлено шифрование на стороне сервера с использованием ключей KMS в таблицах S3 и добавлена настройка header для дисков S3. Закрывает #48723. #48724 (Johann Gan).
  • Добавлен MemoryTracker для фоновых задач слияний и мутаций. Введены настройки merges_mutations_memory_usage_soft_limit и merges_mutations_memory_usage_to_ram_ratio, представляющие собой мягкий лимит памяти для слияний и мутаций. Если этот лимит достигнут, ClickHouse больше не будет планировать новые задачи слияния или мутации. Также добавлена метрика MergesMutationsMemoryTracking, которая позволяет отслеживать текущее потребление памяти фоновыми задачами. Повторная отправка #46089. Закрывает #48774. #48787 (Dmitry Novik).
  • Функция dotProduct поддерживает массивы. #49050 (FFFFFFFHHHHHHH).
  • Добавлена поддержка оператора SHOW INDEX для повышения совместимости с MySQL. #49158 (Robert Schulze).
  • Добавлена поддержка виртуальных столбцов _file и _path в табличной функции url. — Улучшено сообщение об ошибке для табличной функции url. — исправляет #49231 — исправляет #49232. #49356 (Ziyi Tan).
  • Добавлено поле grants в файл users.xml, позволяющее назначать привилегии пользователям. #49381 (pufit).
  • Добавлена поддержка операций FULL/RIGHT JOIN с использованием алгоритма Grace Hash Join. #49483 (lgbo).
  • Модификатор WITH FILL выполняет заполнение, группируя его по префиксу сортировки. Управляется настройкой use_with_fill_by_sorting_prefix (включена по умолчанию). Связано с #33203#issuecomment-1418736794. #49503 (Igor Nikonov).
  • Clickhouse-client теперь принимает запросы, указанные после "--multiquery", если не задан параметр "--query" (или "-q"). Пример: clickhouse-client --multiquery "select 1; select 2;". #49870 (Alexey Gerasimchuk).
  • Добавлен отдельный параметр handshake_timeout для получения пакета Hello от реплики. Закрывает #48854. #49948 (Kruglov Pavel).
  • Добавлена функция "space", которая возвращает строку, состоящую из заданного количества пробелов. #50103 (Robert Schulze).
  • Добавлена опция --input_format_csv_trim_whitespaces. #50215 (Alexey Gerasimchuk).
  • Разрешить функции dictGetAll для словарей-деревьев с регулярными выражениями возвращать значения для нескольких совпадений в виде массивов. Закрывает #50254. #50255 (Johann Gan).
  • Добавлена функция toLastDayOfWeek для округления даты или даты со временем до ближайшей субботы или воскресенья. #50315 (Victor Krasnov).
  • Возможность игнорировать индексы пропуска данных с помощью параметра ignore_data_skipping_indices. #50329 (Boris Kuschel).
  • Добавлена таблица system.user_processes и запрос SHOW USER PROCESSES для отображения информации о потреблении памяти и ProfileEvents на уровне пользователей. #50492 (János Benjamin Antal).
  • Добавлены серверные настройки и настройки форматов display_secrets_in_show_and_select для отображения секретов таблиц, баз данных, табличных функций и словарей. Добавлена привилегия displaySecretsInShowAndSelect, контролирующая, какие пользователи могут просматривать секреты. #46528 (Mike Kot).
  • Добавлена возможность настраивать ROW POLICY для всех таблиц, принадлежащих DATABASE. #47640 (Ilya Golshtein).

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

  • По умолчанию включено сжатие меток и первичного ключа. Это значительно сокращает время выполнения холодных запросов. Примечание по обновлению: поддержка сжатых меток и первичного ключа была добавлена в версии 22.9. Если вы включили сжатые метки или первичный ключ либо установили версию 23.5 или новее, в которой сжатые метки или первичный ключ включены по умолчанию, вы не сможете откатиться до версии 22.8 или более ранней. Вы также можете явно отключить сжатые метки или первичный ключ, указав настройки compress_marks и compress_primary_key в разделе <merge_tree> файла конфигурации сервера. #42587 (Alexey Milovidov).
  • Новый параметр s3_max_inflight_parts_for_one_file задаёт ограничение на число одновременно загружаемых частей при multipart-загрузке одного файла. #49961 (Sema Checherinda).
  • При чтении из нескольких файлов уменьшено количество потоков параллельного разбора для каждого файла. Исправлено #42192. #46661 (SmitaRKulkarni).
  • Используйте агрегирующую PROJECTION только если при её использовании считывается меньше гранул, чем при обычном чтении. Это должно помочь в случае, когда запрос попадает по PK таблицы, но не по PROJECTION. Исправляет #49150. #49417 (Nikolai Kochetov).
  • Не хранить блоки в хэш-соединении ANY, если ничего не вставлено. #48633 (vdimir).
  • Исправлена работа агрегатного комбинатора -If в режиме JIT-компиляции, а также включена JIT-компиляция для агрегатных функций. Закрывает #48120. #49083 (Igor Nikonov).
  • Для чтения из удалённых таблиц мы используем более мелкие задачи (вместо чтения всей части), чтобы механизм task stealing работал; размер задач определяется размером столбцов для чтения; для чтения из S3 всегда используются буферы размером 1 МБ; границы сегментов кэша выровнены по 1 МБ, чтобы они имели приемлемый размер даже при небольших задачах. Это также должно предотвратить фрагментацию. #49287 (Nikita Taranov).
  • Добавлены настройки: - merge_max_block_size_bytes для ограничения объёма памяти, используемой фоновыми операциями. - vertical_merge_algorithm_min_bytes_to_activate чтобы задать дополнительное условие активации вертикальных слияний. #49313 (Nikita Mikhaylov).
  • Размер буфера чтения по умолчанию при работе с локальной файловой системой изменён на немного более оптимальное значение. Также добавлены две новые настройки: max_read_buffer_size_local_fs и max_read_buffer_size_remote_fs. #49321 (Nikita Taranov).
  • Улучшено использование памяти и скорость работы словарей SPARSE_HASHED/HASHED (например, SPARSE_HASHED теперь потребляет в 2.6 раза меньше памяти и работает примерно в 2 раза быстрее). #49380 (Azat Khuzhin).
  • Оптимизированы таблицы system.query_log и system.query_thread_log за счет использования LowCardinality там, где это возможно. Запросы к этим таблицам будут выполняться быстрее. #49530 (Alexey Milovidov).
  • Улучшена производительность чтения локальных файлов Parquet (за счёт параллельного чтения). #49539 (Michael Kolupaev).
  • Увеличена производительность RIGHT/FULL JOIN до 2 раз в некоторых сценариях, особенно при соединении небольшой левой таблицы с большой правой таблицей. #49585 (lgbo).
  • Улучшена производительность BLAKE3 на 11% за счет включения LTO для Rust. #49600 (Azat Khuzhin). Теперь она сопоставима с реализацией на C++.
  • Оптимизирована структура таблицы system.opentelemetry_span_log. Используйте LowCardinality, где это уместно. Хотя эта таблица в целом довольно неудачная (она использует тип данных Map даже для общих атрибутов), так будет немного лучше. #49647 (Alexey Milovidov).
  • Теперь выполняется предварительное резервирование размера хеш-таблицы в соединении grace_hash. #49816 (lgbo).
  • Параллельное слияние состояний uniqExactIf. Закрывает #49885. #50285 (flynn).
  • Улучшение Keeper: добавлен запрос CheckNotExists в Keeper, который повышает производительность реплицируемых таблиц. #48897 (Antonio Andelic).
  • Улучшения производительности Keeper: избежать повторной сериализации одного и того же запроса при обработке. Кэшировать результаты десериализации больших запросов. Управляется новым параметром координации min_request_size_for_cache. #49004 (Antonio Andelic).
  • Снижено количество запросов List к ZooKeeper при выборе частей для слияния, если многие партиции не содержат данных для слияния. #49637 (Alexander Tokmakov).
  • Переработан механизм блокировок кэша файловой системы #44985 (Kseniia Sumarokova).
  • Отключает режим полностью параллельных реплик, если возможна тривиальная оптимизация count. #50594 (Raúl Marín).
  • Не отправлять HEAD‑запрос для всех ключей при выводе схемы Iceberg, а только для ключей, которые используются для чтения данных. #50203 (Kruglov Pavel).
  • Настройка enable_memory_bound_merging_of_aggregation_results включена по умолчанию. #50319 (Nikita Taranov).

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

  • Кодек DEFLATE_QPL снижает минимальную требуемую версию SIMD до SSE 4.2. изменение документации в qpl – Intel® QPL использует диспетчер ядер, работающий во время выполнения, и проверку CPUID для выбора наилучшей доступной реализации (SSE/AVX2/AVX512); переработан CMake-файл для сборки qpl в ClickHouse в соответствии с последней версией upstream qpl. #49811 (jasperzhu).
  • Добавлена начальная поддержка выполнения JOIN с чисто параллельными репликами. #49544 (Raúl Marín).
  • Больше параллелизма при удалении устаревших частей с использованием "zero-copy replication". #49630 (Alexander Tokmakov).
  • Параллельные реплики: 1) Исправлена ошибка NOT_FOUND_COLUMN_IN_BLOCK при использовании параллельных реплик с нереплицируемым хранилищем и отключённой настройкой parallel_replicas_for_non_replicated_merge_tree. 2) Теперь allow_experimental_parallel_reading_from_replicas может принимать 3 значения — 0, 1 и 2. 0 — отключено, 1 — включено, при сбое они тихо отключаются (в случае FINAL или JOIN), 2 — включено, при сбое выбрасывается исключение. 3) Если модификатор FINAL используется в запросе SELECT и параллельные реплики включены, ClickHouse попытается их отключить, если allow_experimental_parallel_reading_from_replicas установлено в 1, и выбросит исключение в противном случае. #50195 (Nikita Mikhaylov).
  • Когда параллельные реплики включены, они всегда будут пропускать недоступные серверы (поведение контролируется настройкой skip_unavailable_shards, которая по умолчанию включена и может быть только отключена). Это закрывает: #48565. #50293 (Nikita Mikhaylov).

Улучшения

  • Команда BACKUP не расшифровывает данные с зашифрованных дисков при создании резервной копии. Вместо этого данные сохраняются в резервной копии в зашифрованном виде. Такие резервные копии можно восстановить только на зашифрованный диск с тем же (или расширенным) списком ключей шифрования. #48896 (Vitaly Baranov).
  • Добавлена возможность использовать временные таблицы в предложении FROM операторов ATTACH PARTITION FROM и REPLACE PARTITION FROM. #49436 (Roman Vasin).
  • Добавлена настройка async_insert для таблиц MergeTree. Она имеет тот же смысл, что и настройка уровня запроса async_insert, и включает асинхронные вставки для конкретной таблицы. Примечание: она не влияет на запросы вставки из clickhouse-client, в этом случае используйте настройку уровня запроса. #49122 (Anton Popov).
  • Добавлена поддержка суффиксов размера в параметрах оператора CREATE QUOTA. #49087 (Eridanus).
  • Добавлена поддержка значения NULL в функциях first_value и last_value. #46467 (lgbo).
  • Добавлены алиасы str_to_map и mapFromString для extractKeyValuePairs. Закрывает https://github.com/clickhouse/clickhouse/issues/47185. #49466 (flynn).
  • Добавлена поддержка CGroup версии 2 для асинхронных метрик по использованию и доступности памяти. Тем самым закрывается #37983. #45999 (sichenzhao).
  • Табличные функции cluster теперь всегда пропускают недоступные сегменты; закрывает #46314. #46765 (zk_kiger).
  • Разрешить пустые столбцы в заголовке CSV‑файла. #47496 (你不要过来啊).
  • Добавлена табличная функция gcs для Google Cloud Storage, совместимого с S3. Как и функции oss и cosn, она является всего лишь псевдонимом для табличной функции s3 и не добавляет новых возможностей. #47815 (Kuba Kaflik).
  • Добавлена возможность использовать строгий размер частей для S3 (совместимость с хранилищем Cloudflare R2 S3). #48492 (Azat Khuzhin).
  • Добавлены новые столбцы с информацией о репликах базы данных Replicated в таблицу system.clusters: database_shard_name, database_replica_name, is_active. Добавлено необязательное предложение FROM SHARD к запросу SYSTEM DROP DATABASE REPLICA. #48548 (Alexander Tokmakov).
  • Добавлен новый столбец zookeeper_name в таблицу system.replicas, указывающий, в каком (дополнительном) кластере ZooKeeper хранятся метаданные реплицированной таблицы. #48549 (cangyin).
  • Оператор IN теперь поддерживает сравнение значений типов Date и Date32. Закрывает #48736. #48806 (flynn).
  • Поддержка стирающих кодов в HDFS, авторы: @M1eyu2018, @tomscut. #48833 (M1eyu).
  • Реализована команда SYSTEM DROP REPLICA для вспомогательных кластеров ZooKeeper, что может закрыть #48931. #48932 (wangxiaobo).
  • Добавлен тип данных Array для MongoDB. Закрывает #48598. #48983 (Nikolay Degterinsky).
  • Добавлена поддержка хранения типов данных Interval в таблицах. #49085 (larryluogit).
  • Теперь можно использовать оконную функцию ntile без явного задания рамки окна: ntile(3) OVER (ORDER BY a), закрыта задача #46763. #49093 (vdimir).
  • Добавлены настройки (number_of_mutations_to_delay, number_of_mutations_to_throw) для задержки или отклонения запросов ALTER, которые создают мутации (ALTER UPDATE, ALTER DELETE, ALTER MODIFY COLUMN, ...), в случае, если в таблице уже есть много незавершённых мутаций. #49117 (Anton Popov).
  • Перехватывать исключение из create_directories в файловом кэше. #49203 (Kseniia Sumarokova).
  • Копирует встроенные примеры в новое поле example таблицы system.functions, дополняя поле description. #49222 (Dan Roscigno).
  • Добавлены параметры подключения для словаря MongoDB. Пример: xml <source> <mongodb> <host>localhost</host> <port>27017</port> <user></user> <password></password> <db>test</db> <collection>dictionary_source</collection> <options>ssl=true</options> </mongodb> </source> ### Запись в документации об изменениях, заметных пользователям. #49225 (MikhailBurdukov).
  • Добавлен псевдоним asymptotic для вычислительного метода asymp в функции kolmogorovSmirnovTest. Улучшена документация. #49286 (Nikita Mikhaylov).
  • Агрегатные функции groupBitAnd/Or/Xor теперь работают с данными знаковых целочисленных типов. Это делает их поведение согласованным с поведением скалярных функций bitAnd/Or/Xor. #49292 (exmy).
  • Документация по функциям разбита на более мелкие поля. #49300 (Robert Schulze).
  • Используйте несколько потоков, общих для всех таблиц на сервере, для загрузки устаревших частей данных. Размер пула и его очереди управляется настройками max_outdated_parts_loading_thread_pool_size и outdated_part_loading_thread_pool_queue_size. #49317 (Nikita Mikhaylov).
  • Больше не завышается оценка размера обработанных данных для столбцов LowCardinality, когда они используют общие словари между блоками. Это закрывает #49322. См. также #48745. #49323 (Alexey Milovidov).
  • Parquet writer теперь использует оптимальный размер группы строк при вызове через OUTFILE. #49325 (Michael Kolupaev).
  • Разрешено использовать ограниченные ключевые слова, такие как ARRAY, в качестве псевдонима, если он заключён в кавычки. Исправлена проблема #49324. #49360 (Nikolay Degterinsky).
  • Задачи загрузки и удаления частей данных были перенесены в общие серверные пулы вместо отдельных пулов для каждой таблицы. Размеры пулов управляются настройками max_active_parts_loading_thread_pool_size, max_outdated_parts_loading_thread_pool_size и max_parts_cleaning_thread_pool_size в конфигурации верхнего уровня. Настройки на уровне таблицы max_part_loading_threads и max_part_removal_threads признаны устаревшими. #49474 (Nikita Mikhaylov).
  • Разрешено использование ?password=pass в URL-адресе интерфейса Play. Пароль подменяется в истории браузера. #49505 (Mike Kot).
  • Разрешено чтение объектов с нулевым размером из удалённых файловых систем (так как пустые файлы не попадают в резервную копию, в результате в файле метаданных могут оказаться блобы нулевого размера). Закрывает #49480. #49519 (Kseniia Sumarokova).
  • Присоединять трекер памяти потока MemoryTracker к total_memory_tracker после отсоединения ThreadGroup. #49527 (Dmitry Novik).
  • Исправлена работа параметризованных представлений, когда параметр запроса используется несколько раз в запросе. #49556 (Azat Khuzhin).
  • Освобождает память, выделенную под последний отправленный снимок ProfileEvents в рамках запроса. Продолжение #47564. #49561 (Dmitry Novik).
  • Функция makeDate теперь поддерживает MySQL-совместимую перегрузку (аргументы: год и день года). #49603 (Robert Schulze).
  • Добавлена поддержка табличной функции dictionary для RegExpTreeDictionary. #49666 (Han Fei).
  • Добавлена политика планирования ввода-вывода с взвешенным справедливым распределением. Добавлен динамический менеджер ресурсов, который позволяет обновлять иерархию планирования ввода-вывода во время работы без перезапуска сервера. #49671 (Sergei Trifonov).
  • Добавлен запрос compose после multipart-загрузки в GCS. Это позволяет использовать операцию копирования для объектов, загруженных с помощью multipart-загрузки. Рекомендуется установить s3_strict_upload_part_size в конкретное значение, потому что запрос compose может завершиться неудачей для объектов, собранных из частей разного размера. #49693 (Antonio Andelic).
  • Для функции extractKeyValuePairs: улучшена логика парсинга по принципу «best effort», чтобы допускать key_value_delimiter как часть значения. Это также упрощает ветвление и может немного ускорить работу. #49760 (Arthur Passos).
  • Добавлено поле initial_query_id в system.processors_profile_log #49777 (helifu).
  • Теперь для таблиц системных журналов можно задавать пользовательские ключи сортировки. #49778 (helifu).
  • Новое поле partitions в system.query_log используется для указания, какие партиции участвуют в вычислениях. #49779 (helifu).
  • Добавлена настройка enable_the_endpoint_id_with_zookeeper_name_prefix для ReplicatedMergeTree (по умолчанию отключена). При включении она добавляет имя кластера ZooKeeper к межсерверной точке взаимодействия таблицы. Это позволяет избежать ошибок Duplicate interserver IO endpoint при наличии реплицируемых таблиц с одинаковым путём, но разными вспомогательными кластерами ZooKeeper. #49780 (helifu).
  • Добавлена поддержка параметров запроса в clickhouse-local. Закрывает #46561. #49785 (Nikolay Degterinsky).
  • Теперь по умолчанию разрешена загрузка словарей и функций из файлов YAML. В предыдущих версиях для этого требовалось отредактировать dictionaries_config или user_defined_executable_functions_config в конфигурационном файле, так как они ожидали файлы *.xml. #49812 (Alexey Milovidov).
  • Движок таблицы Kafka теперь позволяет использовать столбцы-псевдонимы. #49824 (Aleksandr Musorin).
  • Добавлена настройка, ограничивающая максимальное количество пар, создаваемых extractKeyValuePairs, чтобы предотвратить чрезмерное потребление памяти. #49836 (Arthur Passos).
  • Добавлена поддержка (необычного) случая, когда аргументы оператора IN — одноэлементные кортежи. #49844 (MikhailBurdukov).
  • Теперь функция bitHammingDistance поддерживает типы данных String и FixedString. Закрывает #48827. #49858 (flynn).
  • Исправлены ошибки сброса таймаутов в клиенте под OS X. #49863 (alekar).
  • Добавлена поддержка больших целых чисел, таких, как UInt128, Int128, UInt256 и Int256, в функции bitCount. Это позволяет вычислять расстояние Хэмминга над большими битовыми масками в AI-приложениях. #49867 (Alexey Milovidov).
  • Отпечатки, используемые вместо идентификаторов ключей в зашифрованных дисках. Это упрощает конфигурацию зашифрованных дисков. #49882 (Vitaly Baranov).
  • Добавлен тип данных UUID для PostgreSQL. Закрывает #49739. #49894 (Nikolay Degterinsky).
  • Функция toUnixTimestamp теперь принимает аргументы типов Date и Date32. #49989 (Victor Krasnov).
  • Учитывать для словарей только память сервера. #49995 (Azat Khuzhin).
  • Сервер будет допускать использование настроек SQL_*, таких как SQL_AUTO_IS_NULL, которые не выполняют никаких действий (no-op), для совместимости с MySQL. Это закрывает задачу #49927. #50013 (Alexey Milovidov).
  • Сохранять initial_query_id для запросов ON CLUSTER, что полезно при интроспекции (при distributed_ddl_entry_format_version=5). #50015 (Azat Khuzhin).
  • Сохранена обратная совместимость для переименованных настроек с помощью алиасов (allow_experimental_projection_optimization для optimize_use_projections, allow_experimental_lightweight_delete для enable_lightweight_delete). #50044 (Azat Khuzhin).
  • Добавлена поддержка передачи FQDN через настройку my_hostname, чтобы регистрировать узел кластера в Keeper. Добавлена настройка invisible для поддержки нескольких групп вычислительных ресурсов (compute groups). Группа вычислительных ресурсов как кластер невидима для других compute-групп. #50186 (Yangkuan Liu).
  • Исправлена проблема в PostgreSQL: считывались все данные, даже если был указан LIMIT n. #50187 (Kseniia Sumarokova).
  • Добавлены новые события профилирования для запросов с подзапросами (QueriesWithSubqueries/SelectQueriesWithSubqueries/InsertQueriesWithSubqueries). #50204 (Azat Khuzhin).
  • Добавлено поле roles в файл users.xml, позволяющее задавать роли с грантами через конфигурационный файл. #50278 (pufit).
  • Сообщать CGroupCpuCfsPeriod и CGroupCpuCfsQuota в AsynchronousMetrics. Учитывать ограничения памяти cgroup v2 во время запуска сервера. #50379 (alekar).
  • Добавлен обработчик сигнала SIGQUIT, работающий так же, как SIGINT. Закрыта задача #50298. #50435 (Nikolay Degterinsky).
  • При ошибке разбора JSON, вызванной слишком большим размером объекта, выводить последнюю позицию для упрощения отладки. #50474 (Valentin Alexeev).
  • Добавлена поддержка десятичных чисел переменного размера. Закрывает #49130. #50586 (Kruglov Pavel).

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

  • Новый и улучшенный keeper-bench. Всё можно настраивать из YAML/XML-файла: - генератор запросов — каждый тип генератора запросов может иметь свой набор полей - несколько запросов можно генерировать, просто описав то же самое под ключом multi - для каждого запроса или подзапроса в multi можно задать поле weight для управления распределением - можно задать деревья, которые нужно подготовить для тестового прогона - хосты можно определять с полностью настраиваемыми таймаутами; можно управлять количеством сессий, создаваемых для каждого хоста - целые числа, заданные полями min_value и max_value, являются генераторами случайных чисел. #48547 (Antonio Andelic).
  • Io_uring не поддерживается на macOS, не выбирайте его при локальном запуске тестов, чтобы избежать случайных сбоев. #49250 (Frank Chen).
  • Добавлена поддержка именованного внедрения сбоев для тестирования. #49361 (Han Fei).
  • Теперь можно запускать ClickHouse в операционных системах, где системный вызов prctl (process control) недоступен, например в AWS Lambda. #49538 (Alexey Milovidov).
  • Исправлен конфликт при сборке между contrib/isa-l и isa-l в qpl 49296. #49584 (jasperzhu).
  • Утилиты теперь собираются только при явном указании параметра ("-DENABLE_UTILS=1"), а не по умолчанию, что уменьшает время компоновки в типичных сборках для разработки. #49620 (Robert Schulze).
  • Вынесено описание сборки idxd-config в отдельный файл CMake, чтобы избежать его случайного удаления в будущем. #49651 (jasperzhu).
  • Добавлена проверка CI с включённым анализатором в ветке master. Продолжение #49562. #49668 (Dmitry Novik).
  • Переход на LLVM/clang 16. #49678 (Azat Khuzhin).
  • Добавлена возможность сборки ClickHouse с помощью clang-17. #49851 (Alexey Milovidov). #50410 (Alexey Milovidov).
  • ClickHouse теперь проще интегрировать в другие CMake-проекты. #49991 (Amos Bird). (Что настоятельно не рекомендуется — Alexey Milovidov).
  • Исправлено странное дополнительное логирование QEMU после #47151, см. https://s3.amazonaws.com/clickhouse-test-reports/50078/a4743996ee4f3583884d07bcd6501df0cfdaa346/stateless_tests__release__databasereplicated__[3_4].html. #50442 (Mikhail f. Shiryaev).
  • В ClickHouse добавлена поддержка Linux RISC-V 6.1.22. Что закрывает #50456. #50457 (Alexey Milovidov).
  • Обновлена внутренняя библиотека protobuf до v3.18 (исправляет ошибочно обозначенную уязвимость CVE-2022-1941). #50400 (Robert Schulze).
  • Обновлена внутренняя версия libxml2 до v2.10.4 (исправляет ошибочно заявленные уязвимости CVE-2023-28484 и CVE-2023-29469). #50402 (Robert Schulze).
  • Обновлён c-ares до версии v1.19.1 (фиктивные CVE-2023-32067, CVE-2023-31130, CVE-2023-31147). #50403 (Robert Schulze).
  • Исправлена ошибочная запись об уязвимости CVE-2022-2469 в libgsasl. #50404 (Robert Schulze).

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

  • ActionsDAG: исправлена ошибочная оптимизация #47584 (Salvatore Mesoraca).
  • Корректная обработка параллельных снимков в Keeper #48466 (Antonio Andelic).
  • MergeTreeMarksLoader теперь содержит DataPart вместо DataPartStorage #48515 (SmitaRKulkarni).
  • Исправление состояния последовательности #48603 (Ilya Golshtein).
  • Проверка конкурентного выполнения BACKUP/RESTORE с учётом предыдущих неудачных запусков #48726 (SmitaRKulkarni).
  • Исправлена ошибка: при присоединении таблицы с несуществующим путем в ZK метрика ReadonlyReplica больше не увеличивается #48954 (wangxiaobo).
  • Исправлена возможная ситуация вызова terminate из-за неперехваченного исключения в некоторых местах #49112 (Kruglov Pavel).
  • Исправлена ошибка «key not found» для запросов с несколькими StorageJoin #49137 (vdimir).
  • Исправлен ошибочный результат запроса при использовании первичного ключа Nullable #49172 (Duc Canh Le).
  • Исправлена работа функций reinterpretAs*() на машинах с порядком байт big-endian #49198 (Suzy Wang).
  • (Экспериментальная репликация zero-copy) Более атомарная блокировка частей zero-copy #49211 (alesapin).
  • Исправлена гонка состояний при загрузке устаревших частей #49223 (Alexander Tokmakov).
  • Исправлена ошибка, из-за которой при всех значениях ключей null и использовании группировки с rollup возвращался неверный результат #49282 (Shuai li).
  • Исправлено вычисление load_factor для HASHED-словарей с сегментами #49319 (Azat Khuzhin).
  • Запрещена настройка кодеков сжатия для столбцов‑псевдонимов #49363 (Timur Solodовников).
  • Исправлена ошибка при удалении существующего каталога парта #49365 (alesapin).
  • Исправлена работа GCS при использовании HMAC #49390 (Antonio Andelic).
  • Исправлена ошибка фаззинга, при которой Set подзапроса не создаётся при чтении из remote() #49425 (Alexander Gololobov).
  • Инвертирован shutdown_wait_unfinished_queries #49427 (Konstantin Bogdanov).
  • (Экспериментальная zero-copy репликация) Исправлена ещё одна ошибка zero-copy #49473 (alesapin).
  • Исправлена настройка базы данных Postgres #49481 (Mal Curtis).
  • Исправлена обработка аргументов s3Cluster #49490 (Antonio Andelic).
  • Исправлена ошибка в деструкторе TraceCollector. #49508 (Yakov Olkhovskiy).
  • Исправлена проблема, из-за которой AsynchronousReadIndirectBufferFromRemoteFS ломался при коротких операциях seek #49525 (Michael Kolupaev).
  • Исправлен порядок загрузки словарей #49560 (Alexander Tokmakov).
  • Запрещено изменять тип данных столбца Object('json') #49563 (Nikolay Degterinsky).
  • Исправлен стресс‑тест (Logical error: Expected 7134 >= 11030) #49623 (Kseniia Sumarokova).
  • Исправлена ошибка в DISTINCT #49628 (Alexey Milovidov).
  • Исправлено: DISTINCT при использовании сортировки с нулевыми значениями в столбцах, не участвующих в сортировке #49636 (Igor Nikonov).
  • Исправлена ошибка на единицу в больших целых числах, обнаруженная UBSan при фаззинге #49645 (Alexey Milovidov).
  • Исправлено чтение из разреженных столбцов после перезапуска #49660 (Anton Popov).
  • Исправлена проверка assert в SpanHolder::finish() при использовании файберов #49673 (Kruglov Pavel).
  • Исправлены функции с коротким замыканием и мутации с разрежёнными аргументами #49716 (Anton Popov).
  • Исправлена ошибка записи добавленных файлов в инкрементные бэкапы #49725 (Vitaly Baranov).
  • Исправлена ошибка "There is no physical column _row_exists in table", возникающая при выполнении мутации легковесного удаления над таблицей со столбцом типа Object. #49737 (Alexander Gololobov).
  • Исправлена проблема с msan в randomStringUTF8(нечётное число) #49750 (Robert Schulze).
  • Исправлена агрегатная функция kolmogorovSmirnovTest #49768 (FFFFFFFHHHHHHH).
  • Исправлены алиасы настроек в нативном протоколе #49776 (Azat Khuzhin).
  • Исправлена работа arrayMap с массивом кортежей из одного элемента #49789 (Anton Popov).
  • Исправлены настройки троттлинга IO/BACKUP на уровне запроса #49797 (Azat Khuzhin).
  • Исправлена установка значения NULL в определении профиля #49831 (Vitaly Baranov).
  • Исправлена ошибка при работе с проекциями и настройкой aggregate_functions_null_for_empty (для query_plan_optimize_projection) #49873 (Amos Bird).
  • Исправлена обработка ожидающего пакета для асинхронного INSERT в таблицу Distributed после перезапуска #49884 (Azat Khuzhin).
  • Исправлена проверка assert в CacheMetadata::doCleanup #49914 (Kseniia Sumarokova).
  • исправлен is_prefix в OptimizeRegularExpression #49919 (Han Fei).
  • Исправлены метрики WriteBufferFromS3Bytes, WriteBufferFromS3Microseconds и WriteBufferFromS3RequestsErrors #49930 (Aleksandr Musorin).
  • Исправлена ошибка кодирования IPv6 в protobuf #49933 (Yakov Olkhovskiy).
  • Исправлена возможная логическая ошибка при некорректной обработке Nullable в текстовых форматах #49960 (Kruglov Pavel).
  • Добавлена настройка output_format_parquet_compliant_nested_types для создания файлов Parquet с лучшей совместимостью #50001 (Michael Kolupaev).
  • Исправлена логическая ошибка в стресс‑тесте "Not enough space to add ..." #50021 (Kseniia Sumarokova).
  • Устранена взаимоблокировка, возникавшая при запуске таблицы в потоке attach движка ReplicatedMergeTree #50026 (Antonio Andelic).
  • Исправлен assert в SpanHolder::finish() при использовании fibers, попытка 2 #50034 (Kruglov Pavel).
  • Добавлено корректное экранирование при сериализации контекста OpenTelemetry в DDL #50045 (Azat Khuzhin).
  • Исправлено сообщение о повреждённых частях PROJECTION #50052 (Amos Bird).
  • Исправление JIT-компиляции операции not equals для NaN #50056 (Maksim Kita).
  • Исправлен сбой при использовании базы данных Replicated без аргументов #50058 (Azat Khuzhin).
  • Исправлена ошибка, приводившая к сбою при использовании multiIf с константным условием и Nullable-аргументами #50123 (Anton Popov).
  • Исправлен некорректный анализ индекса для ключей, связанных с датами #50153 (Amos Bird).
  • не разрешать изменять ORDER BY, если нет столбцов ORDER BY #50154 (Han Fei).
  • Исправлен некорректный анализ индекса, если бинарный оператор содержит константный аргумент NULL #50177 (Amos Bird).
  • clickhouse-client: запрещено использовать --query и --queries-file одновременно #50210 (Alexey Gerasimchuk).
  • Исправлено неопределённое поведение (UB) в расширениях INTO OUTFILE (APPEND / AND STDOUT) и WATCH EVENTS #50216 (Azat Khuzhin).
  • Исправлено игнорирование пробелов в конце строки в формате CustomSeparatedIgnoreSpaces #50224 (Kruglov Pavel).
  • Исправлена обработка метаданных Iceberg #50232 (Kseniia Sumarokova).
  • Исправлена ошибка во вложенном распределённом SELECT в предложении WITH #50234 (Azat Khuzhin).
  • Исправлена проблема MSan в keyed siphash #50245 (Robert Schulze).
  • Исправлены ошибки в сокетах Poco в неблокирующем режиме, теперь используются по-настоящему неблокирующие сокеты #50252 (Kruglov Pavel).
  • Исправлено вычисление контрольной суммы для записей резервной копии #50264 (Vitaly Baranov).
  • Исправление обработки NaN в функциях сравнения #50287 (Maksim Kita).
  • Исправление ошибки с Nullable-ключом в JIT-агрегации #50291 (Maksim Kita).
  • Исправлена ошибка, из-за которой clickhouse-local аварийно завершался при записи пустого вывода Arrow или Parquet #50328 (Michael Kolupaev).
  • Исправлена ошибка, приводившая к аварийному завершению работы при вызове Pool::Entry::disconnect() #50334 (Val Doroshchuk).
  • Улучшена операция fetch part за счёт более длительного удержания блокировки каталога #50339 (SmitaRKulkarni).
  • Исправлены функции bitShift* при использовании обоих аргументов как констант #50343 (Kruglov Pavel).
  • Исправлена взаимоблокировка в Keeper при возникновении исключения во время предварительной обработки запросов. #50387 (frinkr).
  • Исправлено хеширование целочисленных констант #50421 (Robert Schulze).
  • Исправлена работа параметров merge_tree_min_rows_for_seek и merge_tree_min_bytes_for_seek для индексов пропуска данных #50432 (Azat Khuzhin).
  • Ограничено количество одновременно выполняющихся задач по загрузке устаревших частей #50450 (Nikita Mikhaylov).
  • Исправление Keeper: применять незакоммиченное состояние после установки снимка #50483 (Antonio Andelic).
  • Исправлено неправильное свёртывание констант #50536 (Alexey Milovidov).
  • Исправлена логическая ошибка в стресс‑тесте (Not enough space to add ...) #50583 (Kseniia Sumarokova).
  • Исправлено преобразование Null в LowCardinality(Nullable) при использовании табличной функции values #50637 (Kruglov Pavel).
  • Откатили некорректную оптимизацию RegExpTreeDictionary #50642 (Johann Gan).

Выпуск ClickHouse 23.4, 2023-04-26

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

  • Форматтер %M в функции formatDateTime() теперь выводит название месяца вместо минут. Это делает поведение согласованным с MySQL. Предыдущее поведение можно восстановить с помощью настройки formatdatetime_parsedatetime_m_is_month_name = 0. #47246 (Robert Schulze).
  • Это изменение имеет смысл только в том случае, если вы используете кэш виртуальной файловой системы. Если path в конфигурации кэша виртуальной файловой системы не пустой и не является абсолютным путём, то он будет размещён в <clickhouse server data directory>/caches/<path_from_cache_config>. #48784 (Kseniia Sumarokova).
  • Первичные/вторичные индексы и ключи сортировки с идентичными выражениями теперь отклоняются. Это поведение можно отключить с помощью настройки allow_suspicious_indices. #48536 (凌涛).

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

  • Добавлена поддержка новой агрегатной функции quantileGK/quantilesGK, аналогичной функции approx_percentile в Spark. Алгоритм Гринвальда–Ханны описан в статье http://infolab.stanford.edu/~datar/courses/cs361a/papers/quantiles.pdf. #46428 (李扬).
  • Добавлен оператор SHOW COLUMNS, который выводит сводную информацию из system.columns. #48017 (Robert Schulze).
  • Добавлены модификаторы LIGHTWEIGHT и PULL для запроса SYSTEM SYNC REPLICA. Версия LIGHTWEIGHT ожидает только завершения загрузок и drop-ranges (слияния и мутации игнорируются). Версия PULL загружает новые записи из ZooKeeper и не ждёт их обработки. Исправляет #47794. #48085 (Alexander Tokmakov).
  • Добавлена функция kafkaMurmurHash для обеспечения совместимости с Kafka DefaultPartitioner. Закрывает #47834. #48185 (Nikolay Degterinsky).
  • Теперь можно легко создать пользователя с теми же правами, что и у текущего пользователя, с помощью GRANT CURRENT GRANTS. #48262 (pufit).
  • Добавлена статистическая агрегатная функция kolmogorovSmirnovTest. Закрыта задача #48228. #48325 (FFFFFFFHHHHHHH).
  • В таблицу system.replicas добавлен столбец lost_part_count. Значение столбца показывает общее количество потерянных частей в соответствующей таблице. Значение хранится в ZooKeeper и может использоваться вместо неперсистентного события профилирования ReplicatedDataLoss для мониторинга. #48526 (Sergei Trifonov).
  • Добавлена функция soundex для совместимости. Закрывает #39880. #48567 (FriendLey).
  • Добавлена поддержка типа Map в JSONExtract. #48629 (李扬).
  • Добавлен формат PrettyJSONEachRow для вывода читабельного JSON с разделением строк и отступами в 4 пробела. #48898 (Kruglov Pavel).
  • Добавлен формат входных данных ParquetMetadata для чтения метаданных файлов Parquet. #48911 (Kruglov Pavel).
  • Добавлена функция extractKeyValuePairs для извлечения пар ключ–значение из строк. Входные строки могут содержать шум (например, файлы логов / не обязаны быть на 100% отформатированы в виде пар ключ–значение), алгоритм будет искать пары ключ–значение, соответствующие переданным в функцию аргументам. В настоящее время функция принимает следующие аргументы: data_column (обязательный), key_value_pair_delimiter (по умолчанию :), pair_delimiters (по умолчанию \space \, \;) и quoting_character (по умолчанию двойные кавычки). #43606 (Arthur Passos).
  • Функции replaceOne(), replaceAll(), replaceRegexpOne() и replaceRegexpAll() теперь могут вызываться с неконстантными аргументами шаблона и замены. #46589 (Robert Schulze).
  • Добавлены функции для работы со столбцами типа Map: mapConcat, mapSort, mapExists. #48071 (Anton Popov).

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

  • Чтение файлов в формате Parquet теперь значительно быстрее. IO и декодирование выполняются параллельно (управляется настройкой max_threads), и читаются только необходимые диапазоны данных. #47964 (Michael Kolupaev).
  • Если мы запускаем мутацию с IN (подзапросом) следующего вида: ALTER TABLE t UPDATE col='new value' WHERE id IN (SELECT id FROM huge_table) и таблица t состоит из нескольких частей, то для каждой части в памяти строится set для подзапроса SELECT id FROM huge_table. При большом количестве частей это может потреблять много памяти (и приводить к OOM) и процессорного времени. Решение — ввести краткоживущий кеш set-ов, которые в данный момент строятся задачами мутации. Если другая задача той же мутации выполняется параллельно, она может найти set в кеше, дождаться окончания его построения и повторно использовать его. #46835 (Alexander Gololobov).
  • Проверять зависимости только при необходимости при применении запросов ALTER TABLE. #48062 (Raúl Marín).
  • Оптимизирована функция mapUpdate. #48118 (Anton Popov).
  • Теперь внутренний запрос к локальной реплике отправляется явно, а данные из него принимаются через loopback-интерфейс. Настройка prefer_localhost_replica не учитывается для параллельных реплик. Это необходимо для более эффективного планирования и делает код чище: инициатор отвечает только за координацию процесса чтения и слияние результатов, постоянно обрабатывая запросы, в то время как все вторичные запросы читают данные. Замечание: использование loopback-интерфейса само по себе менее эффективно по производительности, но без него некоторые реплики могли бы оставаться без задач, что привело бы к ещё более медленному выполнению запроса и неиспользованию всех доступных ресурсов. Инициализация координатора теперь ещё более отложенная. Все входящие запросы содержат информацию об алгоритме чтения, и мы инициализируем координатор с этим алгоритмом при поступлении первого запроса. Если какая-либо реплика решит читать с другим алгоритмом — будет выброшено исключение и запрос будет прерван. #48246 (Nikita Mikhaylov).
  • Не строить set для правой части IN с подзапросом, когда он используется только для анализа пропускающих индексов, и они отключены настройкой (use_skip_indexes=0). Ранее это могло отрицательно влиять на производительность запросов. #48299 (Anton Popov).
  • Обработка запроса параллелизуется сразу после чтения FROM file(...). Связано с #38755. #48525 (Igor Nikonov). Обработка запроса параллелизуется сразу после чтения из любого источника данных. Затронутые источники данных — в основном простые или внешние хранилища, такие как табличные функции url, file. #48727 (Igor Nikonov). Это контролируется настройкой parallelize_output_from_storages, которая по умолчанию отключена.
  • Снижена конкуренция за мьютекс в ThreadPool (может повысить производительность при огромном количестве маленьких задач). #48750 (Sergei Trifonov).
  • Снижено потребление памяти для нескольких мутаций ALTER DELETE. #48522 (Nikolai Kochetov).
  • Удалены избыточные попытки подключения, если включена настройка skip_unavailable_shards. #48771 (Azat Khuzhin).

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

  • Записи в кэше запросов теперь агрегируются до max_block_size и сжимаются. #45912 (Robert Schulze).
  • Теперь можно задавать квоты на пользователя в кэше запросов. #48284 (Robert Schulze).
  • Исправлены некоторые проблемы с параллельными репликами. #48433 (Nikita Mikhaylov).
  • Реализована zero-copy-replication (экспериментальная функциональность) на зашифрованных дисках. #48741 (Vitaly Baranov).

Улучшения

  • Увеличено значение по умолчанию для connect_timeout_with_failover_ms до 1000 мс (в связи с добавлением асинхронных подключений в https://github.com/ClickHouse/ClickHouse/pull/47229). Закрывает #5188. #49009 (Kruglov Pavel).
  • Несколько улучшений, связанных с озерами данных: - Обеспечена работа Iceberg с данными без партиций. - Добавлена поддержка формата Iceberg версии v2 (ранее поддерживалась только v1). - Добавлена поддержка чтения данных, разбитых на партиции, для DeltaLake/Hudi. - Ускорено чтение метаданных DeltaLake за счёт использования checkpoint-файлов Delta. - Исправлено некорректное чтение Hudi: ранее неправильно выбирались данные для чтения, и поэтому корректно обрабатывались только таблицы небольшого размера. - Эти движки теперь подхватывают обновления изменённых данных (ранее состояние фиксировалось при создании таблицы). - Настроено корректное тестирование Iceberg/DeltaLake/Hudi с использованием Spark. #47307 (Kseniia Sumarokova).
  • Добавлено асинхронное подключение к сокету и асинхронная запись в сокет. Установка соединений и отправка запроса/внешних таблиц по сегментам сделаны асинхронными. Рефакторинг кода с использованием fibers. Закрывает #46931. После этого PR мы сможем по умолчанию увеличить connect_timeout_with_failover_ms (https://github.com/ClickHouse/ClickHouse/issues/5188). #47229 (Kruglov Pavel).
  • Добавлена поддержка секций конфигурации keeper/keeper_server в качестве альтернативы zookeeper. Закрыты #34766, #34767. #35113 (李扬).
  • Теперь можно задавать флаг secure в named_collections для словаря с источником в таблице ClickHouse. Исправляет #38450. #46323 (Ilya Golshtein).
  • Функция bitCount поддерживает типы данных FixedString и String. #49044 (flynn).
  • Добавлены настраиваемые повторные попытки для всех операций с [Zoo]Keeper при выполнении запросов BACKUP. #47224 (Nikita Mikhaylov).
  • Включить use_environment_credentials для S3 по умолчанию, так чтобы по умолчанию строилась вся цепочка провайдеров. #47397 (Antonio Andelic).
  • В настоящее время функция JSON_VALUE во многом аналогична функции Spark get_json_object, которая позволяет получать значение из JSON-строки по пути вида '$.key'. Однако есть отличия: 1) в Spark get_json_object будет возвращено null, если путь не существует, тогда как JSON_VALUE вернёт пустую строку; 2) в Spark get_json_object может быть возвращено значение сложного типа, например объект/массив JSON, тогда как JSON_VALUE в таком случае вернёт пустую строку. #47494 (KevinyhZou).
  • Для use_structure_from_insertion_table_in_table_functions обеспечено более гибкое распространение структуры таблицы-вставки на табличную функцию. Исправлена проблема с сопоставлением имён и использованием виртуальных столбцов. Больше нет необходимости в настройке 'auto'. #47962 (Yakov Olkhovskiy).
  • Не продолжать попытки переподключения к Keeper, если запрос был отменён или превысил лимиты. #47985 (Raúl Marín).
  • Добавлена поддержка ввода/вывода Enum в BSONEachRow, разрешены все типы ключей Map и устранены лишние вычисления при выводе. #48122 (Kruglov Pavel).
  • Поддерживаются дополнительные типы ClickHouse в форматах ORC/Arrow/Parquet: Enum(8|16), (U)Int(128|256), Decimal256 (для ORC), добавлена возможность чтения IPv4 из значений Int32 (ORC выводит IPv4 как Int32, и мы не могли прочитать его обратно), исправлено чтение Nullable(IPv6) из двоичных данных для ORC. #48126 (Kruglov Pavel).
  • Добавлены столбцы perform_ttl_move_on_insert, load_balancing в таблицу system.storage_policies, изменён тип столбца volume_type на Enum8. #48167 (lizhuoyu5).
  • Добавлена поддержка команды BACKUP ALL, которая выполняет резервное копирование всех таблиц и баз данных, включая временные и системные. #48189 (Vitaly Baranov).
  • Функция mapFromArrays поддерживает тип Map в качестве входного параметра. #48207 (李扬).
  • Результат выполнения некоторых команд SHOW PROCESSLIST теперь сортируется. #48241 (Robert Schulze).
  • Ограничение пропускной способности на уровне запроса и сервера для remote IO/local IO/операций BACKUP (серверные настройки: max_remote_read_network_bandwidth_for_server, max_remote_write_network_bandwidth_for_server, max_local_read_bandwidth_for_server, max_local_write_bandwidth_for_server, max_backup_bandwidth_for_server; настройки: max_remote_read_network_bandwidth, max_remote_write_network_bandwidth, max_local_read_bandwidth, max_local_write_bandwidth, max_backup_bandwidth). #48242 (Azat Khuzhin).
  • Поддержка дополнительных типов в формате CapnProto: Map, (U)Int(128|256), Decimal(128|256). Разрешены целочисленные преобразования при вводе и выводе. #48257 (Kruglov Pavel).
  • Не выбрасывать исключение CURRENT_WRITE_BUFFER_IS_EXHAUSTED при штатной работе. #48288 (Raúl Marín).
  • Добавлена новая настройка keeper_map_strict_mode, которая обеспечивает дополнительные гарантии для операций, выполняемых с таблицами KeeperMap. #48293 (Antonio Andelic).
  • Проверяется, что тип первичного ключа для простого словаря — нативный беззнаковый целочисленный тип. Добавлена настройка check_dictionary_primary_key для совместимости (установите check_dictionary_primary_key = false, чтобы отключить проверку). #48335 (lizhuoyu5).
  • Не реплицируйте мутации для KeeperMap, поскольку в этом нет необходимости. #48354 (Antonio Andelic).
  • Добавлена возможность записи и чтения безымянного кортежа как вложенного сообщения Message в формате Protobuf. Элементы кортежа и поля сообщения сопоставляются по порядку. #48390 (Kruglov Pavel).
  • Добавлена поддержка настроек additional_table_filters и additional_result_filter в новом планировщике. Также добавлен раздел документации для additional_result_filter. #48405 (Dmitry Novik).
  • parseDateTime теперь поддерживает спецификатор формата '%f' (дробные секунды). #48420 (Robert Schulze).
  • Спецификатор формата "%f" в formatDateTime() теперь выводит "000000", если у форматируемого значения нет дробных секунд; предыдущее поведение (один ноль) можно восстановить с помощью настройки "formatdatetime_f_prints_single_zero = 1". #48422 (Robert Schulze).
  • Не реплицировать операции DELETE и TRUNCATE для KeeperMap. #48434 (Antonio Andelic).
  • Генерировать корректные значения типов Decimal и Bool в функции generateRandom. #48436 (Kruglov Pavel).
  • Разрешено использование завершающих запятых в списке выражений запроса SELECT, например SELECT a, b, c, FROM table. Закрывает #37802. #48438 (Nikolay Degterinsky).
  • Переменные окружения CLICKHOUSE_USER и CLICKHOUSE_PASSWORD теперь переопределяются клиентскими параметрами --user и --password. Закрывает #38909. #48440 (Nikolay Degterinsky).
  • Добавлены повторные попытки загрузки частей данных в таблицах MergeTree при возникновении повторяемых ошибок. #48442 (Anton Popov).
  • Добавлена поддержка типов данных Date, Date32, DateTime, DateTime64 в функциях arrayMin, arrayMax, arrayDifference. Закрыта задача #21645. #48445 (Nikolay Degterinsky).
  • Добавлена поддержка макроса {server_uuid}. Он полезен для идентификации реплик в кластерах с автоматическим масштабированием, когда новые реплики постоянно добавляются и удаляются во время работы. Тем самым закрыта #48554. #48563 (Alexey Milovidov).
  • Теперь скрипт установки создаёт жёсткую ссылку вместо копирования, когда это возможно. #48578 (Alexey Milovidov).
  • Добавлена поддержка синтаксиса SHOW TABLE, эквивалентного SHOW CREATE TABLE. Закрывает #48580. #48591 (flynn).
  • Временные буферы HTTP теперь могут работать, вытесняя данные из кэша виртуальной файловой системы. #48664 (Vladimir C).
  • Добавлена поддержка автоматического вывода схемы для CREATE AS SELECT. Закрывает #47599. #48679 (flynn).
  • Добавлена настройка replicated_max_mutations_in_one_entry для ReplicatedMergeTree, которая позволяет ограничить количество команд мутации в одной записи MUTATE_PART (значение по умолчанию — 10000). #48731 (Alexander Tokmakov).
  • В типах AggregateFunction не учитывать неиспользованные байты арены при вычислении read_bytes. #48745 (Raúl Marín).
  • Исправлена ситуация, при которой некоторые параметры MySQL не обрабатывались при использовании источника словаря MySQL и именованной коллекции. Закрывает #48402. #48759 (Kseniia Sumarokova).
  • Если пользователь задаёт max_single_part_upload_size слишком большим, это может привести к аварийному завершению работы из-за ошибки в AWS S3 SDK. Это исправление решает проблему #47679. #48816 (Alexey Milovidov).
  • Устранена гонка данных в RabbitMQ (отчёт), выполнен рефакторинг кода. #48845 (Kseniia Sumarokova).
  • Добавлены псевдонимы name и part_name в таблицах system.parts и system.part_log. Закрыта задача #48718. #48850 (sichenzhao).
  • Функции "arrayDifferenceSupport()", "arrayCumSum()" и "arrayCumSumNonNegative()" теперь поддерживают входные массивы целочисленных типов расширенной разрядности (U)Int128/256. #48866 (cluster).
  • Многострочная история в clickhouse-client больше не выравнивается пробелами. Это делает вставку более естественной. #48870 (Joanna Hulboj).
  • Реализовано небольшое улучшение для редкого случая, когда ClickHouse запускается внутри LXC и используется LXCFS. В LXCFS есть проблема: иногда при чтении файла внутри /proc он возвращает ошибку «Transport endpoint is not connected». Эта ошибка корректно записывалась в серверный журнал ClickHouse. Дополнительно реализован обходной путь для этой проблемы: файл повторно открывается. Это минимальное изменение. #48922 (Real).
  • Улучшен учет памяти для предвыборки. В CI настройки предвыборки случайным образом варьируются. #48973 (Kseniia Sumarokova).
  • Теперь заголовки для нативных операций копирования в GCS устанавливаются корректно. #48981 (Antonio Andelic).
  • Добавлена поддержка указания имен настроек в командной строке с использованием дефисов вместо символов подчеркивания, например, --max-threads вместо --max_threads. Также добавлена поддержка символов дефиса Unicode, таких как вместо -- — это полезно, когда вы взаимодействуете с командой в другой компании, и менеджер из этой команды просто скопировал код из MS Word и вставил его. #48985 (alekseygolub).
  • Добавлен переход на аутентификацию по паролю при сбое аутентификации по пользовательскому SSL-сертификату. Закрывает #48974. #48989 (Nikolay Degterinsky).
  • Улучшена встроенная панель мониторинга. Закрыт #46671. #49036 (Kevin Zhang).
  • Добавлены события профилирования для лог-сообщений, чтобы можно было легко увидеть их количество по уровням серьёзности. #49042 (Alexey Milovidov).
  • В предыдущих версиях формат LineAsString работал непоследовательно при включённом или выключенном параллельном разборе при наличии переводов строк формата DOS или macOS Classic. Исправляет #49039. #49052 (Alexey Milovidov).
  • Сообщение об исключении о неразобранном параметре запроса теперь также будет содержать имя параметра. Реализовать повторно #48878. Закрыть #48772. #49061 (Alexey Milovidov).

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

  • Обновлены часовые пояса. Были обновлены следующие зоны: Africa/Cairo, Africa/Casablanca, Africa/El_Aaiun, America/Bogota, America/Cambridge_Bay, America/Ciudad_Juarez, America/Godthab, America/Inuvik, America/Iqaluit, America/Nuuk, America/Ojinaga, America/Pangnirtung, America/Rankin_Inlet, America/Resolute, America/Whitehorse, America/Yellowknife, Asia/Gaza, Asia/Hebron, Asia/Kuala_Lumpur, Asia/Singapore, Canada/Yukon, Egypt, Europe/Kirov, Europe/Volgograd, Singapore. #48572 (Alexey Milovidov).
  • Уменьшено количество зависимостей в заголовочных файлах для ускорения сборки. #47984 (Dmitry Novik).
  • Сжатие меток и индексов в тестах сделано случайным образом. #48286 (Alexey Milovidov).
  • Обновлён внутренний ZSTD с версии 1.5.4 до 1.5.5. #46797 (Robert Schulze).
  • Вертикальные слияния из компактных в широкие части в тестах сделаны случайными. #48287 (Raúl Marín).
  • Добавлена поддержка контрольной суммы CRC32 в HDFS. Исправлены проблемы с производительностью. #48614 (Alexey Milovidov).
  • Удалены оставшиеся элементы поддержки GCC. #48671 (Robert Schulze).
  • Добавлен запуск CI с включённой новой инфраструктурой анализатора. #48719 (Dmitry Novik).

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

  • Исправлен system.query_views_log для материализованных представлений, запускаемых фоновыми потоками #46668 (Azat Khuzhin).
  • Исправлены несколько ошибок, связанных с RENAME COLUMN #46946 (alesapin).
  • Исправлены небольшие проблемы подсветки синтаксиса в clickhouse-format #47610 (Natasha Murashkina).
  • Исправлена ошибка в libc++ из LLVM, приводившая к сбою при загрузке в S3 частей, размер которых превышает INT_MAX #47693 (Azat Khuzhin).
  • Исправлено переполнение в функции sparkbar #48121 (Vladimir C).
  • Исправлено состояние гонки в S3 #48190 (Anton Popov).
  • Отключить JIT для агрегатных функций из-за непоследовательного поведения #48195 (Alexey Milovidov).
  • Небольшие исправления форматирования ALTER #48289 (Natasha Murashkina).
  • Исправлено использование CPU в RabbitMQ (которое увеличилось в 23.2 после #44404) #48311 (Kseniia Sumarokova).
  • Исправлено падение в EXPLAIN PIPELINE для Merge over Distributed #48320 (Azat Khuzhin).
  • Исправлена проблема с сериализацией LowCardinality в виде словаря Arrow #48361 (Kruglov Pavel).
  • Сброс загрузчика сегмента файла кэша в TemporaryFileStream #48386 (Vladimir C).
  • Исправлено возможное зависание SYSTEM SYNC REPLICA при выполнении DROP/REPLACE PARTITION #48391 (Azat Khuzhin).
  • Исправлена ошибка запуска при загрузке distributed таблицы, зависящей от словаря #48419 (MikhailBurdukov).
  • Не проверять зависимости при автоматическом переименовании системных таблиц #48431 (Raúl Marín).
  • Обновлять только затронутые изменениями строки в хранилище KeeperMap #48435 (Antonio Andelic).
  • Исправлена возможная ошибка сегментации памяти в кэше VFS #48469 (Kseniia Sumarokova).
  • Функция toTimeZone вызывает ошибку, если не передана строковая константа #48471 (Jordi Villar).
  • Исправлена логическая ошибка с IPv4 в Protobuf, добавлена поддержка Date32 #48486 (Kruglov Pavel).
  • Флаг "changed" в system.settings вычислялся некорректно для параметров с несколькими значениями #48516 (MikhailBurdukov).
  • Исправлена работа хранилища Memory при включённом сжатии #48517 (Anton Popov).
  • Исправлена работа режима bracketed paste, из‑за которого искажался ввод пароля при переподключении клиента #48528 (Michael Kolupaev).
  • Исправлен вложенный тип Map для ключей типов IP и UUID #48556 (Yakov Olkhovskiy).
  • Исправлено необработанное исключение при использовании параллельного загрузчика для хешированных словарей #48571 (Azat Khuzhin).
  • Агрегатная функция groupArray корректно работает для пустого результата над типами Nullable #48593 (lgbo).
  • Исправлена ошибка в Keeper, из-за которой иногда узел создавался без схемы auth в ACL. #48595 (Aleksei Filatov).
  • Разрешены операторы сравнения IPv4 с UInt #48611 (Yakov Olkhovskiy).
  • Исправлена возможная ошибка, связанная с кэшем #48636 (Kseniia Sumarokova).
  • Асинхронные вставки с пустыми данными больше не будут приводить к возникновению исключения. #48663 (Anton Popov).
  • Исправлена обработка зависимостей таблиц в случае неудачного выполнения операции RENAME TABLE #48683 (Azat Khuzhin).
  • Если первичный ключ содержит повторяющиеся столбцы (что возможно только для проекций PROJECTION), в предыдущих версиях это могло приводить к ошибке #48838 (Amos Bird).
  • Исправление состояния гонки в ZooKeeper при присоединении потоков send_thread и receive_thread #48849 (Alexander Gololobov).
  • Исправлена ошибка «unexpected part name» при попытке удалить игнорируемую отсоединённую part при zero copy репликации #48862 (Michael Lex).
  • Исправлена ошибка, из-за которой столбец Date32 из Parquet/Arrow считывался как столбец другого типа #48864 (Kruglov Pavel).
  • Исправлена ошибка UNKNOWN_IDENTIFIER при выполнении SELECT из таблицы с ROW POLICY и столбцом, имя которого содержит точки #48976 (Kruglov Pavel).
  • Исправлена агрегация по пустым строкам Nullable #48999 (LiuNeng).

Выпуск ClickHouse 23.3 LTS, 2023-03-30

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

  • Легковесные удаления (Lightweight DELETE) готовы для промышленного использования и включены по умолчанию. Запрос DELETE для таблиц MergeTree теперь доступен по умолчанию.
  • Поведение функций *domain*RFC и netloc немного изменено: расширен набор символов, разрешённых в части authority URL, для лучшего соответствия стандартам. #46841 (Azat Khuzhin).
  • Запрещено создание таблиц с движком KafkaEngine с использованием конструкций DEFAULT/EPHEMERAL/ALIAS/MATERIALIZED для столбцов. #47138 (Aleksandr Musorin).
  • Удалена функция "asynchronous connection drain". Связанные настройки и метрики также удалены. Это была внутренняя функция, поэтому её удаление не должно повлиять на пользователей, которые никогда о ней не слышали. #47486 (Alexander Tokmakov).
  • Добавлена поддержка 256-битного типа данных Decimal (более 38 цифр) в arraySum/Min/Max/Avg/Product, arrayCumSum/CumSumNonNegative, arrayDifference, конструировании массивов, операторе IN, параметрах запроса, groupArrayMovingSum, статистических функциях, min/max/any/argMin/argMax, протоколе взаимодействия PostgreSQL (wire protocol), движке таблиц MySQL и одноимённой функции, sumMap, mapAdd, mapSubtract, arrayIntersect. Добавлена поддержка больших целых чисел в arrayIntersect. Статистические агрегатные функции, использующие моменты (например, corr или различные TTest), будут использовать Float64 в качестве внутреннего представления (ранее использовался Decimal128, но это было бессмысленно), и эти функции могут возвращать nan вместо inf в случае бесконечной дисперсии. Некоторые функции были разрешены для типов данных Decimal256, но возвращали Decimal128 в предыдущих версиях — теперь это исправлено. Это закрывает #47569. Это закрывает #44864. Это закрывает #28335. #47594 (Alexey Milovidov).
  • Настройки backup_threads/restore_threads переведены в разряд серверных (вместо пользовательских). #47881 (Azat Khuzhin).
  • Запрещено использование константных и недетерминированных вторичных индексов. #46839 (Anton Popov).

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

  • Добавлен новый режим распределения работы между репликами с помощью настроек parallel_replicas_custom_key и parallel_replicas_custom_key_filter_type. Если кластер состоит из одного сегмента с несколькими репликами, до max_parallel_replicas реплик будут случайным образом выбраны и логически превращены в сегменты. Для каждого такого сегмента соответствующий фильтр добавляется к запросу на стороне инициатора перед отправкой в сегмент. Если кластер состоит из нескольких сегментов, поведение будет таким же, как у sample_key, но с возможностью задать произвольный ключ. #45108 (Antonio Andelic).
  • Опция отображения частичного результата при отмене: Добавлена настройка запроса partial_result_on_first_cancel, позволяющая отменённому запросу (например, из-за Ctrl-C) возвращать частичный результат. #45689 (Alexey Perevyshin).
  • Добавлена поддержка любых движков таблиц для временных таблиц (за исключением движков Replicated и KeeperMap). Закрыта задача #31497. #46071 (Roman Vasin).
  • Добавлена поддержка репликации определяемых пользователем SQL-функций с использованием централизованного хранилища в Keeper. #46085 (Aleksei Filatov).
  • Реализована таблица system.server_settings (аналогичная system.settings), содержащая настройки сервера. #46550 (pufit).
  • Добавлена поддержка запроса UNDROP TABLE. Закрывает #46811. #47241 (chen).
  • Разрешены отдельные гранты для именованных коллекций (например, чтобы можно было дать доступ SHOW/CREATE/ALTER/DROP named collection только к определённым коллекциям, а не ко всем сразу). Закрывает #40894. Добавлен новый тип доступа NAMED_COLLECTION_CONTROL, который по умолчанию не выдаётся пользователю, если явно не добавлен в его конфигурацию (требуется для возможности выполнить GRANT ALL); также show_named_collections больше не обязательно указывать вручную для пользователя по умолчанию, чтобы он имел полный набор прав доступа, как это было в 23.2. #46241 (Kseniia Sumarokova).
  • Добавлена поддержка вложенных пользовательских дисков. Ранее пользовательские диски поддерживали только плоскую структуру. #47106 (Kseniia Sumarokova).
  • Добавлена функция widthBucket (с алиасом WIDTH_BUCKET для совместимости). #42974. #46790 (avoiderboi).
  • Добавлены новые функции parseDateTime/parseDateTimeInJodaSyntax для работы с указанной строкой формата. parseDateTime преобразует String в DateTime в синтаксисе MySQL, parseDateTimeInJodaSyntax выполняет разбор в синтаксисе Joda. #46815 (李扬).
  • Используется dummy UInt8 в качестве структуры по умолчанию для табличной функции null. Закрывает #46930. #47006 (flynn).
  • Добавлена поддержка формата даты с запятой, например Dec 15, 2021, в функции parseDateTimeBestEffort. Закрывает #46816. #47071 (chen).
  • Добавлены настройки http_wait_end_of_query и http_response_buffer_size, соответствующие параметрам URL wait_end_of_query и buffer_size для HTTP-интерфейса. Это позволяет изменять эти настройки в профилях. #47108 (Vladimir C).
  • Добавлена таблица system.dropped_tables, которая показывает таблицы, удалённые из баз данных типа Atomic, но ещё не окончательно удалённые. #47364 (chen).
  • Добавлен INSTR как псевдоним функции positionCaseInsensitive для совместимости с MySQL. Закрывает #47529. #47535 (flynn).
  • Добавлена функция toDecimalString, позволяющая преобразовывать числа в строковое представление с фиксированной точностью. #47838 (Andrey Zvonov).
  • Добавлена настройка MergeTree max_number_of_mutations_for_replica. Она ограничивает количество мутаций частей на одну реплику указанным значением. Ноль означает отсутствие ограничения на количество мутаций на реплику (выполнение по‑прежнему может ограничиваться другими настройками). #48047 (Vladimir C).
  • Добавлена функция для работы с типом MapmapFromArrays, которая позволяет создать отображение из пары массивов. #31125 (李扬).
  • Добавлено управление сжатием в форматах вывода Parquet/ORC/Arrow, а также поддержка большего числа входных форматов сжатия. Это исправляет #13541. #47114 (Kruglov Pavel).
  • Добавлена аутентификация с использованием пользовательских SSL-сертификатов для нативного протокола. Закрывает #47077. #47596 (Nikolay Degterinsky).
  • Добавлены варианты функций *OrNull() и *OrZero() для parseDateTime, а также псевдоним str_to_date для совместимости с MySQL. #48000 (Robert Schulze).
  • Добавлен оператор REGEXP (по аналогии с операторами "LIKE", "IN", "MOD" и т. д.) для улучшения совместимости с MySQL #47869 (Robert Schulze).

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

  • Метки в памяти теперь хранятся в сжатом виде, что позволяет использовать в 3–6 раз меньше памяти. #47290 (Michael Kolupaev).
  • Резервное копирование для очень большого числа файлов в предыдущих версиях было невероятно медленным. Теперь — нет. Теперь оно невероятно быстрое. #47251 (Alexey Milovidov). Добавлен отдельный пул потоков для операций ввода-вывода (I/O) при резервном копировании. Это позволит масштабировать его независимо от других пулов и повысить производительность. #47174 (Nikita Mikhaylov). Теперь для сбора метаданных на финальной стадии обработки резервного копирования используются запрос MultiRead и повторные попытки. #47243 (Nikita Mikhaylov). Если и резервная копия, и восстанавливаемые данные находятся в S3, то теперь должно использоваться серверное копирование. #47546 (Vitaly Baranov).
  • Исправлено избыточное считывание данных в запросах с FINAL. #47801 (Nikita Taranov).
  • Параметр max_final_threads автоматически устанавливается в значение, равное числу ядер, при запуске сервера (по тому же алгоритму, что используется для max_threads). Это улучшает параллелизм выполнения final на серверах с большим числом процессорных ядер. #47915 (Nikita Taranov).
  • Добавлена возможность выполнять конвейер чтения для словаря DIRECT с источником CLICKHOUSE в нескольких потоках. Чтобы включить, установите dictionary_use_async_executor=1 в секции SETTINGS для источника в операторе CREATE DICTIONARY. #47986 (Vladimir C).
  • Оптимизирована производительность агрегации с одним ключом типа Nullable. #45772 (LiuNeng).
  • Реализовано использование индекса tokenbf_v1 в нижнем регистре в функциях hasTokenOrNull, hasTokenCaseInsensitive и hasTokenCaseInsensitiveOrNull. #46252 (ltrk2).
  • Оптимизированы функции position и LIKE путём поиска первых двух символов с использованием SIMD. #46289 (Jiebin Sun).
  • Оптимизированы запросы к system.detached_parts, которые могут быть существенно большими по объёму. Добавлено несколько источников чтения с учётом ограничения на размер блока; в каждом блоке используется пул потоков ввода-вывода для расчёта размера части, то есть для параллельного выполнения системных вызовов. #46624 (Sema Checherinda).
  • Увеличено значение по умолчанию параметра max_replicated_merges_in_queue для таблиц ReplicatedMergeTree с 16 до 1000. Это позволяет ускорить выполнение фоновых операций слияния в кластерах с очень большим количеством реплик, например в кластерах с общим хранилищем в ClickHouse Cloud. #47050 (Alexey Milovidov).
  • Обновлён clickhouse-copier, чтобы использовать GROUP BY вместо DISTINCT при получении списка партиций. Для больших таблиц это сократило время выполнения SELECT с более чем 500 с до менее чем 1 с. #47386 (Clayton McClure).
  • Исправлена деградация производительности в ASOF JOIN. #47544 (Ongkong).
  • Ещё больше пакетной обработки в Keeper. Повышена производительность за счёт того, что при запросах на чтение пакеты больше не разбиваются. #47978 (Antonio Andelic).
  • Разрешено использовать PREWHERE для Merge при различных выражениях DEFAULT для столбцов. #46831 (Azat Khuzhin).

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

  • Параллельные реплики: повышена общая производительность за счет более эффективного использования локальной реплики и по умолчанию запрещено чтение с параллельными репликами из нереплицируемых таблиц MergeTree. #47858 (Nikita Mikhaylov).
  • Поддержка проталкивания фильтра (filter push down) в левую таблицу для JOIN с таблицами Join, Dictionary и EmbeddedRocksDB, если включен экспериментальный Analyzer. #47280 (Maksim Kita).
  • Теперь ReplicatedMergeTree с репликацией zero copy создает меньшую нагрузку на Keeper. #47676 (alesapin).
  • Исправлена ошибка при создании materialized view с MaterializedPostgreSQL. #40807 (Maksim Buren).

Улучшения

  • Параметр input_format_json_ignore_unknown_keys_in_named_tuple включён по умолчанию. #46742 (Kruglov Pavel).
  • Разрешено игнорировать ошибки при записи в MATERIALIZED VIEW (добавлена новая настройка materialized_views_ignore_errors, по умолчанию — false, но для безусловного сброса логов в таблицы system.*_log она установлена в значение true). #46658 (Azat Khuzhin).
  • Отслеживание файловой очереди распределённых отправок в памяти. #45491 (Azat Khuzhin).
  • Теперь заголовки X-ClickHouse-Query-Id и X-ClickHouse-Timezone добавляются в ответы для всех запросов по протоколу HTTP. Ранее это делалось только для запросов SELECT. #46364 (Anton Popov).
  • Внешние таблицы из MongoDB: добавлена поддержка подключения к набору реплик (replica set) по URI с перечнем хостов и портов (host:port), а также поддержка опции readPreference в словарях MongoDB. Пример URI: mongodb://db0.example.com:27017,db1.example.com:27017,db2.example.com:27017/?replicaSet=myRepl&readPreference=primary. #46524 (artem-yadr).
  • Это улучшение должно быть незаметным для вас. Перереализован анализ PROJECTION поверх плана запроса. Добавлена настройка query_plan_optimize_projection=1 для переключения между старой и новой версиями. Исправлена проблема #44963. #46537 (Nikolai Kochetov).
  • По умолчанию в качестве выходного формата используется Parquet v2 вместо v1. Добавлена настройка output_format_parquet_version для управления версией Parquet, возможные значения: 1.0, 2.4, 2.6, 2.latest (по умолчанию). #46617 (Kruglov Pavel).
  • Теперь можно использовать новый синтаксис конфигурации для настройки топиков Kafka с точками (.) в их именах. #46752 (Robert Schulze).
  • Исправлены эвристики, которые проверяют шаблоны Hyperscan на наличие проблемных повторов. #46819 (Robert Schulze).
  • Не записывать в system.errors о существовании узла ZK, если блок был одновременно создан другой репликой. #46820 (Raúl Marín).
  • Увеличен лимит на количество открытых файлов в clickhouse-local. Теперь он сможет читать из таблиц web на серверах с очень большим количеством ядер CPU. Чтение из движка таблиц URL больше не прекращается при слишком большом количестве открытых файлов. Исправляет #46852. #46853 (Alexey Milovidov).
  • Исключения, возникающие при ошибке разбора чисел, теперь содержат более понятный текст сообщения. #46917 (Robert Schulze).
  • Добавлено обновление таблицы system.backups после каждой обработанной задачи для отслеживания прогресса создания резервных копий. #46989 (Aleksandr Musorin).
  • Разрешено преобразование типов во входном формате Native. Добавлена настройка input_format_native_allow_types_conversion, которая управляет этой возможностью (включена по умолчанию). #46990 (Kruglov Pavel).
  • Разрешить использование IPv4 в функции range для генерации диапазонов IP-адресов. #46995 (Yakov Olkhovskiy).
  • Улучшено сообщение об исключении, возникающем, если невозможно переместить часть с одного тома/диска на другой. #47032 (alesapin).
  • Добавлена поддержка типа Bool в функции JSONType. Ранее для булевых значений по ошибке возвращался тип Null. #47046 (Anton Popov).
  • Используйте параметр _request_body для настройки заранее определённых HTTP-запросов. #47086 (Constantine Peresypkin).
  • Автоматическое добавление отступа во встроенном UI SQL-редакторе при нажатии Enter. #47113 (Alexey Korepanov).
  • При самораспаковке под управлением 'sudo' будет предпринята попытка установить uid и gid распакованных файлов на значения текущего пользователя. #47116 (Yakov Olkhovskiy).
  • Ранее второй аргумент функции repeat принимал только значения типа беззнакового целого числа, поэтому нельзя было передавать, например, -1. Это поведение отличалось от поведения одноимённой функции в Spark. В этом обновлении функция repeat была изменена, чтобы соответствовать поведению функции в Spark: теперь она принимает те же типы входных данных, включая отрицательные целые числа. Для проверки корректности обновлённой реализации было проведено обширное тестирование. #47134 (KevinyhZou). Примечание: этот пункт журнала изменений был переписан с помощью ChatGPT.
  • Удалена часть ::__1 из стек-трейсов. std::basic_string<char, ... теперь отображается как String в стек-трейсах. #47171 (Mike Kot).
  • Пере реализован межсерверный режим для предотвращения атак повторного воспроизведения (обратите внимание, что это изменение обратно совместимо с более старыми серверами). #47213 (Azat Khuzhin).
  • Улучшено распознавание групп регулярных выражений и доработан словарь regexp_tree. #47218 (Han Fei).
  • Улучшение Keeper: добавлена новая 4LW-команда clrs для очистки ресурсов, которые использует Keeper (например, для освобождения неиспользуемой памяти). #47256 (Antonio Andelic).
  • Добавлены необязательные аргументы к кодекам DoubleDelta(bytes_size), Gorilla(bytes_size), FPC(level, float_size), что позволяет использовать эти кодеки без указания типа столбца в clickhouse-compressor. Исправлены возможные аварийные завершения работы и арифметические ошибки в clickhouse-compressor при использовании этих кодеков. Исправления: https://github.com/ClickHouse/ClickHouse/discussions/47262. #47271 (Kruglov Pavel).
  • Добавлена поддержка типов bigint для функции runningDifference. Закрывает #47194. #47322 (Nikolay Degterinsky).
  • Добавлено окно истечения срока действия для S3‑учетных данных с заданным временем истечения, чтобы избежать ошибок ExpiredToken в некоторых граничных случаях. Им можно управлять с помощью параметра конфигурации expiration_window_seconds, значение по умолчанию — 120 секунд. #47423 (Antonio Andelic).
  • Добавлена поддержка типов данных Decimal и Date32 в формате Avro. #47434 (Kruglov Pavel).
  • Не запускать сервер при обнаружении прерванного преобразования из Ordinary в Atomic и выводить более информативное сообщение об ошибке с рекомендациями по устранению неполадок. #47487 (Alexander Tokmakov).
  • Добавлен новый столбец kind в таблицу system.opentelemetry_span_log. Этот столбец хранит значение SpanKind, определённое в OpenTelemetry. #47499 (Frank Chen).
  • Стало возможным чтение и запись вложенных массивов в формате Protobuf, используя в качестве имени столбца только имя корневого поля. Ранее имя столбца должно было содержать все вложенные имена полей (например, a.b.c Array(Array(Array(UInt32))), теперь можно использовать просто a Array(Array(Array(UInt32))). #47650 (Kruglov Pavel).
  • Добавлен необязательный модификатор STRICT для SYSTEM SYNC REPLICA, который заставляет запрос ждать, пока очередь репликации не опустеет (как это работало до https://github.com/ClickHouse/ClickHouse/pull/45648). #47659 (Alexander Tokmakov).
  • Улучшены названия некоторых логов спанов OpenTelemetry. #47667 (Frank Chen).
  • Запрещено использование слишком длинных последовательностей комбинаторов агрегатных функций (они могут приводить к медленным запросам на этапе анализа). Закрывает #47715. #47716 (Alexey Milovidov).
  • Добавлена поддержка подзапросов в параметризованных представлениях; исправлены #46741 #47725 (SmitaRKulkarni).
  • Исправлена утечка памяти в интеграции с MySQL (воспроизводится при connection_auto_close=1). #47732 (Kseniia Sumarokova).
  • Улучшена обработка ошибок в коде, работающем с параметрами Decimal, что привело к более информативным сообщениям об ошибках. Ранее при передаче некорректных параметров Decimal выводилось неясное или мало полезное сообщение об ошибке. В этом обновлении текст сообщения был исправлен так, чтобы предоставлять более подробную и полезную информацию, что упрощает выявление и устранение проблем, связанных с параметрами Decimal. #47812 (Yu Feng). Примечание: эта запись в журнале изменений была переформулирована ChatGPT.
  • Параметр exact_rows_before_limit используется для того, чтобы параметр rows_before_limit_at_least точно отражал количество строк, возвращённых до достижения лимита. Этот pull request исправляет проблемы, возникавшие, если запрос выполнялся с распределённой обработкой по нескольким сегментам или с операциями сортировки. До этого обновления такие сценарии работали не так, как предполагалось. #47874 (Amos Bird).
  • Интроспекция метрик пулов потоков. #47880 (Azat Khuzhin).
  • Добавлены события профилирования WriteBufferFromS3Microseconds и WriteBufferFromS3RequestsErrors. #47885 (Antonio Andelic).
  • Добавлены опции --link и --noninteractive (-y) при установке ClickHouse. Закрыта задача #47750. #47887 (Nikolay Degterinsky).
  • Исправлено возникновение исключения UNKNOWN_TABLE при выполнении ATTACH для materialized view, у которой есть зависящие от неё, но недоступные таблицы. Это может быть полезно при попытке восстановить состояние из резервной копии. #47975 (MikhailBurdukov).
  • Исправлена ситуация, когда (необязательный) путь не добавлялся в конфигурацию зашифрованного диска. #47981 (Kseniia Sumarokova).
  • Поддержка CTE в параметризованных представлениях. Реализация: добавлена поддержка параметров запроса при вычислении скалярных подзапросов. #48065 (SmitaRKulkarni).
  • Добавлена поддержка типов больших целых чисел (U)Int128/(U)Int256, Map с ключами любого типа и DateTime64 с произвольной точностью (не только 3 и 6). #48119 (Kruglov Pavel).
  • Добавлена возможность пропускать ошибки, связанные с неизвестными значениями enum, во входных форматах построчного ввода данных. #48133 (Alexey Milovidov).

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

  • ClickHouse теперь собирается с C++23. #47424 (Robert Schulze).
  • Фаззинг запросов EXPLAIN в AST Fuzzer. #47803 #47852 (flynn).
  • Разделены стресс‑тест и автоматическая проверка обратной совместимости (теперь Upgrade check). #44879 (Kruglov Pavel).
  • Обновлён образ Ubuntu для Docker, чтобы «успокоить» некоторые ложные отчёты о безопасности. #46784 (Julio Jimenez). Обратите внимание, что ClickHouse не имеет зависимостей и не требует Docker.
  • Добавлена подсказка, позволяющая удалить уже существующий загруженный бинарный файл clickhouse при использовании загрузки ClickHouse через "curl | sh". Текст подсказки: "ClickHouse binary clickhouse already exists. Overwrite? [y/N]". #46859 (Dan Roscigno).
  • Исправлена ошибка при запуске сервера на старых дистрибутивах (например, Amazon Linux 2) и на ARM, когда не находились символы glibc 2.28. #47008 (Robert Schulze).
  • Подготовка к clang 16. #47027 (Amos Bird).
  • Добавлена проверка в CI, которая гарантирует, что ClickHouse может работать со старой glibc на ARM. #47063 (Robert Schulze).
  • Добавлена проверка стиля для предотвращения некорректного использования макроса NDEBUG. #47699 (Alexey Milovidov).
  • Незначительно ускорена сборка. #47714 (Alexey Milovidov).
  • Обновлён vectorscan до версии 5.4.9. #47955 (Robert Schulze).
  • Добавлен модульный тест, который проверяет, что аварийное логирование Apache Arrow не приводит к аварийному завершению (abort). Он покрывает изменения в ClickHouse/arrow#16. #47958 (Arthur Passos).
  • Восстановлена возможность запуска нативной отладочной сборки сервера для macOS. #48050 (Robert Schulze). Примечание: это изменение актуально только для разработки, поскольку официальные сборки ClickHouse собираются с использованием кросс‑компиляции.

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

  • Исправлен некорректный сброс парсера форматов, добавлен тест обработки некорректных сообщений в Kafka #45693 (Kruglov Pavel).
  • Исправлен расчет объема данных в Keeper #46086 (Antonio Andelic).
  • Исправлена ошибка в автоматических повторных попытках выполнения запроса DROP TABLE для таблиц ReplicatedMergeTree и баз данных Atomic. В редких случаях это могло приводить к ошибкам Can't get data for node /zk_path/log_pointer и The specified key does not exist, если срок действия сессии ZooKeeper истекал во время выполнения DROP, а новая реплицируемая таблица с тем же путём в ZooKeeper создавалась параллельно. #46384 (Alexander Tokmakov).
  • Исправлена некорректная рекурсия алиасов при нормализации запросов, которая приводила к тому, что некоторые запросы не выполнялись. #46609 (Raúl Marín).
  • Исправлены проблемы с сериализацией и десериализацией IPv4/IPv6 в бинарных форматах #46616 (Kruglov Pavel).
  • ActionsDAG: не изменять результат операции and во время оптимизации #46653 (Salvatore Mesoraca).
  • Улучшена отмена запросов при аварийном завершении работы клиента #46681 (Alexander Tokmakov).
  • Исправлены арифметические операции в оптимизации агрегирования #46705 (Duc Canh Le).
  • Исправлено возможное аварийное завершение clickhouse-local при автоматическом определении схемы JSONEachRow #46731 (Kruglov Pavel).
  • Исправлена ошибка при изменении истёкшей роли #46772 (Vitaly Baranov).
  • Исправлена ошибка комбинированного накопления столбцов PREWHERE из нескольких шагов #46785 (Alexander Gololobov).
  • Теперь используется начальный диапазон для определения размера файла в HTTP-буфере чтения. Без этого изменения некоторые удалённые файлы не могли быть обработаны. #46824 (Antonio Andelic).
  • Исправлен некорректно работающий индикатор прогресса при использовании URL-таблиц #46830 (Antonio Andelic).
  • Исправлен отчет MSan в функции maxIntersections #46847 (Alexey Milovidov).
  • Исправлена ошибка в типе данных Map #46856 (Alexey Milovidov).
  • Исправлены некорректные результаты некоторых запросов с использованием LIKE, когда шаблон LIKE содержит экранированные символы, которые не подлежат экранированию #46875 (Robert Schulze).
  • Исправление: WITH FILL мог приводить к аварийному завершению работы, когда FillingTransform обрабатывал пустой блок #46897 (Yakov Olkhovskiy).
  • Исправлен вывод типов date и int из строк в JSON #46972 (Kruglov Pavel).
  • Исправлена ошибка выбора диска для zero-copy репликации при выполнении fetch #47010 (alesapin).
  • Исправлена опечатка в определении службы systemd #47051 (Palash Goel).
  • Исправлена ошибка NOT_IMPLEMENTED, возникавшая при использовании CROSS JOIN и algorithm = auto #47068 (Vladimir C).
  • Исправлена проблема, из-за которой таблица 'ReplicatedMergeTree' не могла вставить две одинаковые строки данных, когда 'part_type' был настроен в режиме 'InMemory' (экспериментальная функция). #47121 (liding1992).
  • External dictionaries / library-bridge: исправлена ошибка "unknown library method 'extDict_libClone'" #47136 (alex filatov).
  • Исправлена гонка в grace hash join с ограничением LIMIT #47153 (Vladimir C).
  • Исправлена поддержка PREWHERE для отдельных столбцов #47154 (Azat Khuzhin).
  • Устранена возможная взаимная блокировка в Query Status #47161 (Kruglov Pavel).
  • Запрещён INSERT SELECT для одной и той же таблицы типа Join, так как это приводит к взаимоблокировке #47260 (Vladimir C).
  • Пропускать уже слитые партиции при слияниях по порогу min_age_to_force_merge_seconds #47303 (Antonio Andelic).
  • Изменена функция find_first_symbols, чтобы она корректно работала с find_first_not_symbols #47304 (Arthur Passos).
  • Исправлено определение типов для больших чисел в CSV #47410 (Kruglov Pavel).
  • Отключена оптимизация логических выражений для выражений с псевдонимами. #47451 (Nikolai Kochetov).
  • Исправлена ошибка в decodeURLComponent #47457 (Alexey Milovidov).
  • Исправлен граф EXPLAIN при использовании PROJECTION #47473 (flynn).
  • Исправлена обработка параметров запроса #47488 (Alexey Milovidov).
  • Параметризованное представление: исправление ошибки. #47495 (SmitaRKulkarni).
  • Фаззер для форматов данных и соответствующие исправления. #47519 (Alexey Milovidov).
  • Исправлена проверка монотонности для типа данных DateTime64 #47526 (Antonio Andelic).
  • Исправлена ошибка «block structure mismatch» для столбца типа Nullable(LowCardinality) #47537 (Nikolai Kochetov).
  • Корректное устранение ошибки в Apache Parquet #45878 #47538 (Kruglov Pavel).
  • Исправлен параллельный разбор формата BSONEachRow при некорректном размере документа #47540 (Kruglov Pavel).
  • Сохранять ошибку в system.distribution_queue при выполнении команды SYSTEM FLUSH DISTRIBUTED #47541 (Azat Khuzhin).
  • Проверка наличия дублирующегося столбца в формате BSONEachRow #47609 (Kruglov Pavel).
  • Исправлено ожидание блокировки zero-copy при перемещении #47631 (alesapin).
  • Исправлена ошибка агрегации по партициям #47634 (Nikita Taranov).
  • Исправлена ошибка в сериализации кортежа в виде массива в формате BSONEachRow #47690 (Kruglov Pavel).
  • Исправлен сбой в polygonsSymDifferenceCartesian #47702 (pufit).
  • Исправлено чтение сжатых файлов из хранилища File с компрессией zlib и gzip #47796 (Anton Popov).
  • Улучшено обнаружение пустых запросов для PostgreSQL (для драйвера pgx для Go) #47854 (Azat Khuzhin).
  • Исправлена проверка монотонности DateTime для типов LowCardinality #47860 (Antonio Andelic).
  • Используйте restore_threads (а не backup_threads) для RESTORE ASYNC #47861 (Azat Khuzhin).
  • Исправлена работа DROP COLUMN для таблиц ReplicatedMergeTree с проекциями #47883 (Antonio Andelic).
  • Исправлено восстановление реплицированной базы данных #47901 (Alexander Tokmakov).
  • Хотфикс слишком подробных HTTP‑предупреждений #47903 (Alexander Tokmakov).
  • Исправлена ошибка «Field value too long» в catboostEvaluate #47970 (Robert Schulze).
  • Исправление #36971: Watchdog: завершать работу с ненулевым кодом, если завершается дочерний процесс #47973 (Коренберг Марк).
  • Исправлена ошибка: «файл индекса cidx неожиданно длинный» #48010 (SmitaRKulkarni).
  • Исправлен запрос MaterializedPostgreSQL для получения атрибутов replica-identity #48015 (Solomatov Sergei).
  • parseDateTime(): Исправлено неопределённое поведение (переполнение знакового целого) #48019 (Robert Schulze).
  • Используйте уникальные имена для записей (Record) в Avro, чтобы избежать повторного использования их схемы #48057 (Kruglov Pavel).
  • Исправлена установка тайм-аутов TCP/HTTP-сокетов в Keeper #48108 (Antonio Andelic).
  • Исправлен возможный вызов метода на нулевом указателе в формате Avro #48184 (Kruglov Pavel).

Релиз ClickHouse 23.2 от 2023-02-23

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

  • Функция toDayOfWeek() (псевдоним: DAYOFWEEK) расширена аргументом режима, который задаёт, начинается ли неделя с понедельника или воскресенья и начинается ли отсчёт с 0 или с 1. Для согласованности с другими функциями работы с датой и временем аргумент режима был добавлен между аргументами времени и часового пояса. Это ломает существующее использование (ранее недокументированного) синтаксиса с двумя аргументами toDayOfWeek(time, time_zone). Чтобы исправить это, перепишите вызов функции как toDayOfWeek(time, 0, time_zone). #45233 (Robert Schulze).
  • Настройка max_query_cache_size переименована в filesystem_cache_max_download_size. #45614 (Kseniia Sumarokova).
  • Пользователь default по умолчанию не будет иметь прав доступа типа SHOW NAMED COLLECTION (например, пользователь default больше не сможет выдавать ALL другим пользователям, как это было раньше, поэтому этот PR несовместим с предыдущими версиями). #46010 (Kseniia Sumarokova).
  • Если предложение SETTINGS указано перед предложением FORMAT, настройки также будут применяться к форматированию. #46003 (Azat Khuzhin).
  • Удалена поддержка настройки materialized_postgresql_allow_automatic_update (которая по умолчанию была выключена). #46106 (Kseniia Sumarokova).
  • Незначительно улучшена производительность countDigits на реалистичных наборах данных. Этим закрыта задача #44518. В предыдущих версиях countDigits(0) возвращала 0; теперь она возвращает 1, что более корректно и соответствует существующей документации. #46187 (Alexey Milovidov).
  • Запрещено создание новых столбцов, сжатых комбинацией кодеков Delta или DoubleDelta с последующими кодеками Gorilla или FPC. Это ограничение можно обойти, используя настройку allow_suspicious_codecs = true. #45652 (Robert Schulze).

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

  • Добавлены StorageIceberg и табличная функция iceberg для доступа к хранилищу таблиц Iceberg в S3. #45384 (flynn).
  • Добавлена возможность настраивать хранилище с помощью SETTINGS disk = '<disk_name>' (вместо storage_policy), а также с явным созданием диска SETTINGS disk = disk(type=s3, ...). #41976 (Kseniia Sumarokova).
  • Добавлены счетчики ProfileEvents в system.part_log. #38614 (Bharat Nallan).
  • Расширение существующего движка ReplacingMergeTree, позволяющее вставлять дубликаты. Он объединяет возможности ReplacingMergeTree и CollapsingMergeTree в одном движке MergeTree. Удалённые данные не возвращаются при запросах, но при этом не удаляются с диска. #41005 (youennL-cs).
  • Добавлена функция generateULID. Закрыта задача #36536. #44662 (Nikolay Degterinsky).
  • Добавлена агрегатная функция corrMatrix, вычисляющая корреляцию для каждой пары столбцов. Дополнительно, так как агрегатные функции covarSamp и covarPop похожи на corr, заодно добавлены агрегатные функции covarSampMatrix и covarPopMatrix. @alexey-milovidov закрывает #44587. #44680 (FFFFFFFHHHHHHH).
  • Добавлена функция arrayShuffle для случайных перестановок элементов массива. #45271 (Joanna Hulboj).
  • Добавлена поддержка типов FIXED_SIZE_BINARY в Arrow и FIXED_LENGTH_BYTE_ARRAY в Parquet и их отображение на тип FixedString. Добавлены настройки output_format_parquet_fixed_string_as_fixed_byte_array/output_format_arrow_fixed_string_as_fixed_byte_array для управления типом выходных данных по умолчанию для FixedString. Закрывает #45326. #45340 (Kruglov Pavel).
  • Добавлен новый столбец last_exception_time в system.replication_queue. #45457 (Frank Chen).
  • Добавлены две новые функции, которые позволяют использовать заданные пользователем ключи/seed для SipHash128. #45513 (Salvatore Mesoraca).
  • Добавлена поддержка версии табличной функции format с тремя аргументами. Закрыто #45808. #45873 (FFFFFFFHHHHHHH).
  • Добавлена поддержка формата JodaTime для спецификаторов 'x', 'w', 'S'. См. https://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html. #46073 (zk_kiger).
  • Добавлена поддержка оконной функции ntile. (lgbo).
  • Добавлена настройка final, которая неявно применяет модификатор FINAL ко всем таблицам. #40945 (Arthur Passos).
  • Добавлены функции arrayPartialSort и arrayPartialReverseSort. #46296 (Joanna Hulboj).
  • Новый HTTP-параметр client_protocol_version позволяет задавать версию клиентского протокола в HTTP-ответах при использовании формата Native. #40397. #46360 (Geoff Genz).
  • Добавлена новая функция regexpExtract, по аналогии с функцией Spark REGEXP_EXTRACT для совместимости. Она похожа на существующую функцию extract. #46469 (李扬).
  • Добавлена новая функция JSONArrayLength, которая возвращает количество элементов во внешнем JSON-массиве. Функция возвращает NULL, если входная JSON-строка некорректна. #46631 (李扬).

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

  • Новая логика работает, если условие PREWHERE является конъюнкцией из нескольких условий (cond1 AND cond2 AND ... ). Она группирует в шаги те условия, для которых требуется чтение одних и тех же столбцов. После каждого шага вычисляется соответствующая часть полного условия, и результирующие строки могут быть отфильтрованы. Это позволяет читать меньше строк на последующих шагах, тем самым экономя пропускную способность ввода-вывода (I/O) и снижая объём вычислений. В настоящее время эта логика по умолчанию отключена. Она будет включена по умолчанию в одном из будущих релизов, как только будет подтверждено отсутствие регрессий, поэтому настоятельно рекомендуется использовать её при тестировании. Управлять ей можно с помощью двух настроек: "enable_multiple_prewhere_read_steps" и "move_all_conditions_to_prewhere". #46140 (Alexander Gololobov).
  • Добавлена опция, позволяющая независимо агрегировать партиции, если ключ партиционирования таблицы и ключ GROUP BY совместимы. Управляется настройкой allow_aggregate_partitions_independently. По умолчанию отключена из‑за ограниченной применимости (см. документацию). #45364 (Nikita Taranov).
  • Разрешено использовать алгоритм вертикального слияния для частей в формате Compact. Это позволит серверу ClickHouse использовать значительно меньше памяти при фоновых операциях. Это закрывает задачу #46084. #45681 #46282 (Anton Popov).
  • Оптимизирован ридер Parquet за счет использования пакетного ридера. #45878 (LiuNeng).
  • Добавлено новое значение параметра local_filesystem_read_methodio_uring, основанное на асинхронной подсистеме Linux io_uring, что практически во всех случаях повышает производительность чтения по сравнению с методом pread по умолчанию. #38456 (Saulius Valatka).
  • Переписывайте агрегатные функции с выражением if в качестве аргумента, когда это логически эквивалентно. Например, avg(if(cond, col, null)) можно переписать как avgIf(cond, col). Это помогает повысить производительность. #44730 (李扬).
  • Улучшена производительность функций lower/upper с использованием инструкций AVX-512. #37894 (yaqi-zhao).
  • Убрано ограничение, из-за которого на системах с >=32 ядрами и отключённым SMT ClickHouse использует только половину ядер (когда в BIOS отключён Hyper-Threading). #44973 (Robert Schulze).
  • Улучшена производительность функции multiIf за счёт столбцового выполнения, скорость увеличена в 2,3 раза. #45296 (李扬).
  • Добавлен быстрый путь выполнения для функции position, когда искомая подстрока пуста. #45382 (李扬).
  • По умолчанию включена оптимизация query_plan_remove_redundant_sorting. Оптимизация реализована в #45420. #45567 (Igor Nikonov).
  • Увеличен размер фрагмента в HTTP Transfer Encoding для повышения производительности выполнения больших запросов через HTTP-интерфейс. #45593 (Geoff Genz).
  • Улучшена производительность коротких запросов SELECT, которые читают данные из таблиц с большим числом столбцов типов Array/Map/Nested. #45630 (Anton Popov).
  • Повышена производительность фильтрации для больших целых чисел и типов Decimal. #45949 (李扬).
  • Это изменение может эффективно снизить накладные расходы на получение фильтра из столбца ColumnNullable(UInt8) и улучшить общую производительность выполнения запросов. Для оценки влияния этого изменения мы использовали бенчмарк TPC-H, предварительно изменив типы столбцов с non-nullable на Nullable, и измеряли QPS его запросов в качестве показателя производительности. #45962 (Zhiguo Zhou).
  • Виртуальные столбцы _part и _partition_id теперь имеют тип LowCardinality(String). Закрывает #45964. #45975 (flynn).
  • Улучшена производительность преобразования Decimal при неизменном масштабе. #46095 (Alexey Milovidov).
  • Позволяет увеличить предвыборку данных при чтении. #46168 (Kseniia Sumarokova).
  • Переписали arrayExists(x -> x = 1, arr) -> has(arr, 1), что улучшило производительность в 1,34 раза. #46188 (李扬).
  • Исправлено чрезмерное использование памяти при вертикальных слияниях на локальном диске. Параметр max_insert_delayed_streams_for_parallel_write теперь учитывается для удалённого диска. #46275 (Nikolai Kochetov).
  • Обновлена библиотека zstd до версии v1.5.4. В ней есть некоторые незначительные улучшения производительности и коэффициента сжатия. Если вы используете реплики с разными версиями ClickHouse, вы можете увидеть корректные сообщения об ошибках Data after merge/mutation is not byte-identical to data on another replicas. с пояснением. Эти сообщения ожидаемы и не являются поводом для беспокойства. #46280 (Raúl Marín).
  • Устранена деградация производительности, вызванная #39737. #46309 (Alexey Milovidov).
  • Обработчик replicas_status будет отвечать быстро даже при большой очереди репликации. #46310 (Alexey Milovidov).
  • Добавлена поддержка AVX-512 для агрегатной функции sum, унарных арифметических и сравнительных функций. #37870 (zhao zhou).
  • Переписан код, отвечающий за распределение меток и общую координацию чтения, чтобы добиться максимального прироста производительности. Это закрывает #34527. #43772 (Nikita Mikhaylov).
  • Удаляет избыточные предложения DISTINCT в запросах (подзапросах). Реализовано на основе плана запроса. Выполняет оптимизацию, аналогичную optimize_duplicate_order_by_and_distinct в отношении предложений DISTINCT. Может быть включено с помощью настройки query_plan_remove_redundant_distinct. Связано с #42648. #44176 (Igor Nikonov).
  • Несколько оптимизаций для переписывания запросов: sumIf(123, cond) -> 123 * countIf(1, cond), sum(if(cond, 123, 0)) -> 123 * countIf(cond), sum(if(cond, 0, 123)) -> 123 * countIf(not(cond)) #44728 (李扬).
  • Улучшено взаимодействие ограниченного по памяти слияния и агрегации по порядку на верхнем уровне плана запроса. Ранее в некоторых случаях мы переходили к явной сортировке для AIO, хотя в этом не было реальной необходимости. #45892 (Nikita Taranov).
  • Одновременные слияния по умолчанию планируются по принципу циклического обхода (round-robin), чтобы обеспечить справедливую работу без «голодания» задач. Ранее в сильно перегруженных сегментах крупные слияния могли «голодать» по сравнению с мелкими из-за использования строгого приоритетного планирования. Добавлен серверный параметр конфигурации background_merges_mutations_scheduling_policy для выбора алгоритма планирования (round_robin или shortest_task_first). #46247 (Sergei Trifonov).

Улучшения

  • Включить повторные попытки выполнения INSERT по умолчанию при потере сессии ZooKeeper. Мы уже используем эту настройку в продакшене. #46308 (Alexey Milovidov).
  • Добавлена возможность игнорировать неизвестные ключи в объекте JSON для именованных кортежей (input_format_json_ignore_unknown_keys_in_named_tuple). #45678 (Azat Khuzhin).
  • Реализована оптимизация условия where с переносом выражения ключа сортировки в prewhere для запросов с final. #38893. #38950 (hexiaoting).
  • Добавлены новые метрики для бэкапов: num_processed_files и processed_files_size, отражающие фактическое количество обработанных файлов и их общий размер. #42244 (Aleksandr).
  • Добавлены повторные попытки при межсерверных ошибках DNS. #43179 (Anton Kozlov).
  • Улучшение Keeper: добавлена предварительная аллокация места на диске, чтобы избежать неочевидных проблем при нехватке свободного пространства. Введена настройка max_log_file_size для задания максимального размера файлов журнала Raft в Keeper. #44370 (Antonio Andelic).
  • Оптимизирована работа логики API задержки реплики, если реплика доступна только для чтения. #45148 (mateng915).
  • Запрашивать пароль в clickhouse-client в интерактивном режиме, если пустой пароль не подходит. Закрывает #46702. #46730 (Nikolay Degterinsky).
  • Помечать использование сжатия Gorilla для столбцов с типом, отличным от Float*, как подозрительное. #45376 (Robert Schulze).
  • Теперь в столбце postpone_reason отображается имя реплики, выполняющей слияние. #45458 (Frank Chen).
  • Сохранять трассировку стека исключения в part_log. #45459 (Frank Chen).
  • Словарь regexp_tree улучшен и теперь совместим с https://github.com/ua-parser/uap-core. #45631 (Han Fei).
  • Обновлена проверка SYSTEM SYNC REPLICA, что решает #45508 #45648 (SmitaRKulkarni).
  • Переименована настройка replication_alter_partitions_sync в alter_sync. #45659 (Antonio Andelic).
  • Табличная функция generateRandom и движок теперь поддерживают типы данных LowCardinality. Это полезно для тестирования, например можно выполнить запрос INSERT INTO table SELECT * FROM generateRandom() LIMIT 1000. Это понадобилось для отладки #45590. #45661 (Alexey Milovidov).
  • Экспериментальный кэш результатов запроса теперь поддерживает более модульные настройки конфигурации. #45679 (Robert Schulze).
  • Компонент «кэш результатов запросов» переименован в «кэш запросов». #45682 (Robert Schulze).
  • Добавлена команда SYSTEM SYNC FILE CACHE. Она выполняет системный вызов sync. #8921. #45685 (DR).
  • Добавлен новый параметр S3 allow_head_object_request. В этом PR использование запроса GetObjectAttributes вместо HeadObject, добавленного в https://github.com/ClickHouse/ClickHouse/pull/45288, сделано необязательным (и по умолчанию отключено). #45701 (Vitaly Baranov).
  • Добавлена возможность переопределять параметры подключения по имени подключения (то есть теперь можно не хранить пароль для каждого подключения отдельно, а просто поместить все параметры в ~/.clickhouse-client/config.xml и даже использовать для них разные файлы истории, что также может быть полезно). #45715 (Azat Khuzhin).
  • Формат Arrow: добавлена поддержка типа duration. Закрывает #45669. #45750 (flynn).
  • Расширено логирование в кэше запросов (Query Cache) для улучшения анализа его поведения. #45751 (Robert Schulze).
  • Настройки кэша запросов на уровне сервера теперь можно изменять во время работы. #45758 (Robert Schulze).
  • Скрывать пароль в логах при указании аргументов табличной функции с помощью именованной коллекции. #45774 (Vitaly Baranov).
  • Улучшен внутренний S3‑клиент для корректного определения регионов и перенаправлений для различных типов URL-адресов. #45783 (Antonio Andelic).
  • Добавлена поддержка типов Map, IPv4 и IPv6 в generateRandom. Прежде всего полезно для тестирования. #45785 (Raúl Marín).
  • Добавлена поддержка функций empty/notEmpty для IP-типов. #45799 (Yakov Olkhovskiy).
  • Столбец num_processed_files был разделён на два столбца: num_files (для BACKUP) и files_read (для RESTORE). Столбец processed_files_size был разделён на два столбца: total_size (для BACKUP) и bytes_read (для RESTORE). #45800 (Vitaly Baranov).
  • Добавлена поддержка запроса SHOW ENGINES для совместимости с MySQL. #45859 (Filatenkov Artur).
  • Улучшена работа обфускатора с запросами. #45867 (Raúl Marín).
  • Улучшено поведение преобразования в тип Date для граничного значения 65535 (2149-06-06). #46042 #45914 (Joanna Hulboj).
  • Добавлена настройка check_referential_table_dependencies для проверки ссылочных зависимостей между таблицами при выполнении DROP TABLE. Этот PR решает проблему #38326. #45936 (Vitaly Baranov).
  • Исправлена функция tupleElement, теперь она возвращает Null при аргументе Null. Закрывает #45894. #45952 (flynn).
  • Выдавать ошибку при отсутствии файлов, удовлетворяющих шаблону S3. Закрывает #45587. #45957 (chen).
  • Используйте данные о состоянии кластера для проверки одновременного выполнения операций резервного копирования и восстановления. #45982 (SmitaRKulkarni).
  • ClickHouse Client: использовать режим сопоставления «exact» для нечеткого поиска, который корректно игнорирует регистр и использует более подходящий алгоритм сопоставления SQL-запросов. #46000 (Azat Khuzhin).
  • Запрещён некорректный синтаксис создания представления CREATE View X TO Y AS SELECT. Закрывает #4331. #46043 (flynn).
  • Семейство хранилищ Log теперь поддерживает настройку параметра storage_policy. Закрыта задача #43421. #46044 (flynn).
  • Улучшен формат JSONColumns при пустом результате. Закрывает #46024. #46053 (flynn).
  • Добавлена эталонная реализация SipHash128. #46065 (Salvatore Mesoraca).
  • Добавлена новая метрика для учёта времени и объёмов выделений памяти с использованием mmap. #46068 (李扬).
  • В настоящее время для таких функций, как leftPad, rightPad, leftPadUTF8, rightPadUTF8, второй аргумент length должен иметь тип одной из следующих целочисленных величин: UInt8, UInt16, UInt32, UInt64, UInt128 или UInt256. Это чересчур ограничительно для пользователей ClickHouse и, кроме того, не согласуется с поведением других аналогичных функций, таких как arrayResize, substring и т. д. #46103 (李扬).
  • Исправлена assert-проверка в функции welchTTest в отладочной сборке, когда итоговая статистика равна NaN. Поведение унифицировано с другими аналогичными функциями. Изменено поведение функции studentTTest так, чтобы она возвращала NaN вместо выбрасывания исключения, поскольку предыдущее поведение было неудобным. Закрыты #41176 и #42162. #46141 (Alexey Milovidov).
  • Более удобная работа с большими целыми числами и ORDER BY WITH FILL. Разрешено использовать обычные целые числа для начальных и конечных значений в WITH FILL при ORDER BY по большим (128-битным и 256-битным) целым числам. Исправлен ошибочный результат для больших целых чисел с отрицательными начальными или конечными значениями. Закрывает #16733. #46152 (Alexey Milovidov).
  • Добавлены столбцы parts, active_parts и total_marks в system.tables согласно issue. #46161 (attack204).
  • Функции "multi[Fuzzy]Match(Any|AnyIndex|AllIndices}" теперь отклоняют регулярные выражения, которые, вероятнее всего, будут очень медленно обрабатываться в vectorscan. #46167 (Robert Schulze).
  • Когда insert_null_as_default включён и для столбца не задано значение по умолчанию, будет использоваться значение по умолчанию для типа столбца. Также этот PR исправляет применение значений по умолчанию к NULL в случае столбцов типа LowCardinality. #46171 (Kruglov Pavel).
  • Отдавать предпочтение явно заданным ключам доступа для клиентов S3. Если параметр use_environment_credentials имеет значение true и пользователь предоставил ключ доступа через запрос или конфигурацию, он будет использован вместо ключей из переменной окружения. #46191 (Antonio Andelic).
  • Добавлен псевдоним "DATE_FORMAT()" к функции "formatDateTime()" для повышения совместимости с SQL-диалектом MySQL, функция formatDateTime расширена поддержкой подстановок "a", "b", "c", "h", "i", "k", "l", "r", "s", "W". ### Запись в документации об изменениях, видимых пользователю Краткое описание для пользователя: DATE_FORMAT — это псевдоним formatDateTime. Форматирует время в соответствии с заданной строкой формата. Формат — константное выражение, поэтому вы не можете использовать несколько форматов для одного результирующего столбца. (Предоставьте ссылку на formatDateTime). #46302 (Jake Bamrah).
  • Добавлены ProfileEvents и CurrentMetrics о задачах обратного вызова для параллельных реплик таблиц s3Cluster и MergeTree. #46313 (Alexey Milovidov).
  • Добавлена поддержка операторов DELETE и UPDATE для таблиц, использующих движок хранения KeeperMap. #46330 (Antonio Andelic).
  • Разрешено выполнение запросов RENAME с параметрами запроса. Исправляет #45778. #46407 (Nikolay Degterinsky).
  • Исправлены параметризованные запросы SELECT при использовании трансформера REPLACE. Исправлена проблема #33002. #46420 (Nikolay Degterinsky).
  • Исключить внутреннюю базу данных, используемую для временных/внешних таблиц, из расчёта асинхронной метрики "NumberOfDatabases". Это делает поведение единообразным с системной таблицей "system.databases". #46435 (Robert Schulze).
  • В таблицу distribution_queue добавлен столбец last_exception_time. #46564 (Aleksandr).
  • Поддержка оператора IN с параметром в параметризованных представлениях. #46583 (SmitaRKulkarni).
  • Не загружать именованные коллекции при запуске сервера (загружать их при первом обращении к ним). #46607 (Kseniia Sumarokova).

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

  • Внедрён GWP-ASan, реализованный в рантайме LLVM. Это закрывает #27039. #45226 (Han Fei).
  • Мы хотим сделать наши тесты менее стабильными и более «flaky»: добавлена рандомизация настроек merge tree в тестах. #38983 (Anton Popov).
  • Включена поддержка HDFS на PowerPC, что позволяет исправить следующие функциональные тесты: 02113_hdfs_assert.sh, 02244_hdfs_cluster.sql и 02368_cancel_write_into_hdfs.sh. #44949 (MeenaRenganathan22).
  • Добавлен файл службы systemd.service для clickhouse-keeper. Исправляет #44293. #45568 (Mikhail f. Shiryaev).
  • Форк библиотеки Poco в ClickHouse был перемещён из "contrib/" в "base/poco/". #46075 (Robert Schulze).
  • Добавлена опция для clickhouse-watchdog для перезапуска дочернего процесса. Практической пользы от этого немного. #46312 (Alexey Milovidov).
  • Если переменная окружения CLICKHOUSE_DOCKER_RESTART_ON_EXIT установлена в значение 1, Docker‑контейнер будет запускать clickhouse-server как дочерний процесс вместо первого процесса и перезапускать его после завершения. #46391 (Alexey Milovidov).
  • Исправлен файл службы systemd. #46461 (SuperDJY).
  • Повышена минимальная версия Clang, необходимая для сборки ClickHouse, с 12 до 15. #46710 (Robert Schulze).
  • Обновлён Intel QPL с v0.3.0 до v1.0.0, собран libaccel-config и он статически слинкован с библиотекой QPL вместо динамической линковки. #45809 (jasperzhu).

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

  • Сбрасывать данные строго по параметру rabbitmq_flush_interval_ms или по параметру rabbitmq_max_block_size в StorageRabbitMQ. Закрывает #42389. Закрывает #45160. #44404 (Kseniia Sumarokova).
  • Использовать PODArray для отрисовки в функции sparkBar, чтобы контролировать потребление памяти. Закрывает #44467. #44489 (Duc Canh Le).
  • Исправлены функции quantilesExactExclusive и quantilesExactInclusive, которые возвращали неотсортированный элемент массива. #45379 (wujunfu).
  • Исправлено необработанное исключение в HTTPHandler при включённом OpenTelemetry. #45456 (Frank Chen).
  • Не следует выводить тип Date из восьмизначных чисел. Это может привести к некорректному чтению данных. #45581 (Kruglov Pavel).
  • Исправлена логика использования настройки odbc_bridge_use_connection_pooling. #45591 (Bharat Nallan).
  • Когда вызывается callback в кэше, возможно, что этот кэш уже уничтожен. Для безопасности мы захватываем поля по значению. Такой подход также безопасен для планировщика задач, потому что он будет деактивирован до уничтожения хранилища. Исправляет #45548. #45601 (Han Fei).
  • Исправлена ошибка, приводившая к порче данных при совместном использовании кодеков Delta или DoubleDelta с кодеком Gorilla. #45615 (Robert Schulze).
  • Исправлена корректность проверки типов при использовании индекса блум-фильтра N-gram, чтобы избежать некорректных чтений. #45617 (Antonio Andelic).
  • Было сообщено о нескольких ошибках сегментации в районе c-ares. Они появились после моих предыдущих pull request-ов. Я исправил их с помощью Александра Токмакова. #45629 (Arthur Passos).
  • Исправлено описание ключа при обнаружении дублирующихся значений первичного ключа. Такое может происходить в проекциях. Подробности см. в #45590. #45686 (Amos Bird).
  • Установлен метод и уровень сжатия для резервных копий. Закрывает #45690. #45737 (Pradeep Chhetri).
  • Следует использовать select_query_typed.limitByOffset вместо select_query_typed.limitOffset. #45817 (刘陶峰).
  • При использовании экспериментального анализатора запросов запросы вида SELECT number FROM numbers(100) LIMIT 10 OFFSET 10; возвращают некорректные результаты (пустой результат для этого запроса). Это вызвано лишним шагом OFFSET, добавленным планировщиком. #45822 (刘陶峰).
  • Обратная совместимость — разрешено неявное сужающее преобразование из UInt64 в IPv4, необходимое для выражения «INSERT ... VALUES ...». #45865 (Yakov Olkhovskiy).
  • Исправлена ошибка в IPv6‑парсере для смешанных IPv4-адресов с пропущенным первым октетом (например, ::.1.2.3). #45871 (Yakov Olkhovskiy).
  • Добавлен столбец query_kind в таблицу system.processes и в запрос SHOW PROCESSLIST. Удалён дублирующийся код. Это исправляет ошибку: глобальный параметр конфигурации max_concurrent_select_queries не соблюдался для запросов с цепочками INTERSECT или EXCEPT. #45872 (Alexey Milovidov).
  • Исправлено падение в функции stochasticLinearRegression. Обнаружено с помощью WingFuzz. #45985 (Nikolai Kochetov).
  • Исправлен сбой в запросах SELECT с модификаторами INTERSECT и EXCEPT, которые читают данные из таблиц с включёнными разрежёнными столбцами (управляется настройкой ratio_of_defaults_for_sparse_serialization). #45987 (Anton Popov).
  • Исправлена оптимизация чтения по порядку для сортировки по убыванию (DESC) с модификатором FINAL, закрыт #45815. #46009 (Vladimir C).
  • Исправлено чтение несуществующих вложенных столбцов с несколькими уровнями в компактных частях. #46045 (Azat Khuzhin).
  • Исправлен столбец elapsed в system.processes (значения отличались в 10 раз). #46047 (Azat Khuzhin).
  • Дополнительное исправление для Replace domain IP types (IPv4, IPv6) with native https://github.com/ClickHouse/ClickHouse/pull/43221. #46087 (Yakov Olkhovskiy).
  • Исправлена подстановка переменных окружения в конфигурации, если параметр уже имеет значение. Исправление закрывает #46131. Также закрывает #9547. #46144 (pufit).
  • Исправлено некорректное проталкивание предикатов (predicate push down) с GROUPING SETS. Закрывает #45947. #46151 (flynn).
  • Исправлена возможная ошибка, из-за которой конвейер мог зависать в fulls_sorting_join при использовании константных ключей. #46175 (Vladimir C).
  • Функции tuple больше не переписываются в литералы при форматировании, чтобы избежать некорректных результатов. #46232 (Salvatore Mesoraca).
  • Исправлена возможная ошибка выхода за границы при чтении LowCardinality(Nullable) в формате Arrow. #46270 (Kruglov Pavel).
  • Исправлена ошибка, из-за которой запросы SYSTEM UNFREEZE завершались с исключением CANNOT_PARSE_INPUT_ASSERTION_FAILED. #46325 (Aleksei Filatov).
  • Исправлен возможный сбой, который мог быть вызван переполнением целого числа при десериализации агрегирующего состояния функции, хранящей HashTable. #46349 (Nikolai Kochetov).
  • Исправлена возможная LOGICAL_ERROR, возникающая при асинхронных вставках некорректных данных в формате VALUES. #46350 (Anton Popov).
  • Исправлено возникновение LOGICAL_ERROR при попытке выполнить ALTER ... MOVE PART ... TO TABLE. Такой запрос никогда фактически не поддерживался. #46359 (Alexander Tokmakov).
  • Исправлено определение схемы s3Cluster в параллельной распределённой операции INSERT SELECT при включённом parallel_distributed_insert_select. #46381 (Kruglov Pavel).
  • Исправлена обработка запросов вида ALTER TABLE ... UPDATE nested.arr1 = nested.arr2 ..., где arr1 и arr2 являются полями одного и того же столбца типа Nested. #46387 (Anton Popov).
  • Планировщик может не суметь запланировать задачу. Если это происходит, весь MulityPartUpload должен быть прерван, а UploadHelper обязан дождаться уже запланированных задач. #46451 (Dmitry Novik).
  • Исправление PREWHERE для движка Merge с различающимися типами значений по умолчанию (исправляет некоторые ошибки NOT_FOUND_COLUMN_IN_BLOCK, возникающие, когда тип значения по умолчанию для столбца отличается; также разрешает PREWHERE, когда тип столбца одинаков во всех таблицах, и запрещает его, только если они различаются). #46454 (Azat Khuzhin).
  • Исправлена ошибка, приводившая к аварийному завершению при использовании константных значений в ORDER BY. Исправляет #46466. #46493 (Nikolai Kochetov).
  • Не выбрасывать исключение, если параметр disk был указан на уровне запроса, а storage_policy — в секции настроек MergeTree в конфигурации. В этом случае disk переопределяет настройку из конфигурации. #46533 (Kseniia Sumarokova).
  • Исправлена некорректная обработка константного аргумента типа LowCardinality в функции arrayMap. Эта ошибка могла приводить к ошибке сегментирования в релизной сборке и логической ошибке Bad cast в отладочной сборке. #46569 (Alexey Milovidov).
  • Исправляет ошибку #46557. #46611 (Alexander Gololobov).
  • Исправлены бесконечные перезапуски юнита systemd clickhouse-server, если сервер не может запуститься в течение 1 минуты 30 секунд (отключена логика тайм-аута при запуске clickhouse-server из сервиса systemd). #46613 (Azat Khuzhin).
  • Буферы памяти, выделенные при асинхронных вставках, освобождались в глобальном контексте, поэтому счетчики MemoryTracker для соответствующих пользователя и запроса обновлялись некорректно. Это приводило к ложным исключениям OOM. #46622 (Dmitry Novik).
  • Обновлено поведение: больше не очищается on_expression из table_join, поскольку он используется последующими запусками анализа, что исправляет #45185. #46487 (SmitaRKulkarni).

Релиз ClickHouse 23.1 от 2023-01-26

Релиз ClickHouse 23.1

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

  • Запрос SYSTEM RESTART DISK теперь не выполняет никаких действий. #44647 (alesapin).
  • Опция PREALLOCATE для словарей HASHED/SPARSE_HASHED теперь не выполняет никаких действий. #45388 (Azat Khuzhin). Она больше не даёт существенных преимуществ.
  • Запрещён кодек Gorilla для столбцов типов, отличных от Float32 и Float64. #45252 (Robert Schulze). Его использование было бессмысленным и приводило к несогласованностям.
  • Параллельные кворумные вставки могут работать некорректно с таблицами *MergeTree, созданными с использованием устаревшего синтаксиса. Поэтому поддержка параллельных кворумных вставок полностью отключена для таких таблиц. Это не затрагивает таблицы, созданные с использованием нового синтаксиса. #45430 (Alexander Tokmakov).
  • Для получения размера объекта в AWS S3 используется запрос GetObjectAttributes вместо запроса HeadObject. Это изменение, в частности, исправляет обработку конечных точек без явного указания региона после обновления AWS SDK. #45288 (Vitaly Baranov). AWS S3 и Minio протестированы, но имейте в виду, что различные S3-совместимые сервисы (GCS, R2, B2) могут иметь тонкие несовместимости. Это изменение также может потребовать скорректировать ACL, чтобы разрешить запрос GetObjectAttributes.
  • Запрещено использование путей в названиях часовых поясов. Например, название часового пояса /usr/share/zoneinfo/Asia/Aden недопустимо; следует использовать имя из базы часовых поясов IANA, например Asia/Aden. #44225 (Kruglov Pavel).
  • Запросы, комбинирующие equijoin и константные выражения (например, JOIN ON t1.x = t2.x AND 1 = 1), запрещены из-за некорректных результатов. #44016 (Vladimir C).

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

  • Источник словаря, извлекающий ключи при обходе дерева регулярных выражений. Может использоваться для разбора User-Agent. #40878 (Vage Ogannisian). #43858 (Han Fei).
  • Добавлена функциональность параметризованных представлений, теперь для движка таблиц View можно задавать параметры запроса. Решает #40907. #41687 (SmitaRKulkarni).
  • Добавлены функции quantileInterpolatedWeighted и quantilesInterpolatedWeighted. #38252 (Bharat Nallan).
  • Поддержка ARRAY JOIN для типа Map, аналог функции explode в Spark. #43239 (李扬).
  • Добавлена поддержка стандартных для SQL двоичных и шестнадцатеричных строковых литералов. #43785 (Mo Xuan).
  • Добавлена поддержка форматирования DateTime в стиле Joda-Time. См. документацию Joda-Time. #43818 (李扬).
  • Реализована поддержка формата долей секунды (%f) в formatDateTime. #44060 (ltrk2). #44497 (Alexander Gololobov).
  • Добавлена функция age для вычисления разницы между двумя датами или датами со временем, выраженной в количестве полных единиц времени. Закрывает #41115. #44421 (Robert Schulze).
  • Добавлен источник Null для словарей. Закрыта задача #44240. #44502 (mayamika).
  • Добавлена возможность настраивать класс хранилища S3 с помощью опции конфигурации s3_storage_class, например <s3_storage_class>STANDARD/INTELLIGENT_TIERING</s3_storage_class>. Закрывает #44443. #44707 (chen).
  • Вставлять значения по умолчанию, если в JSON-объекте отсутствуют элементы при разборе именованного кортежа. Добавлена настройка input_format_json_defaults_for_missing_elements_in_named_tuple для управления этим поведением. Закрывает #45142#issuecomment-1380153217. #45231 (Kruglov Pavel).
  • Записывает время запуска сервера в ProfileEvents (ServerStartupMilliseconds). Исправляет #43188. #45250 (SmitaRKulkarni).
  • Рефакторинг и улучшение стриминговых движков Kafka/RabbitMQ/NATS и добавление поддержки всех форматов, а также небольшой рефакторинг самих форматов: - Исправлено формирование сообщений в построчных форматах с суффиксами/префиксами. Теперь каждое сообщение полностью форматируется со всеми разделителями и может быть затем снова разобрано с помощью входного формата. - Добавлена поддержка блочных форматów, таких как Native, Parquet, ORC и др. Каждый блок форматируется как отдельное сообщение. Количество строк в одном сообщении зависит от размера блока, поэтому вы можете управлять им с помощью настройки max_block_size. - Добавлены новые настройки движка kafka_max_rows_per_message/rabbitmq_max_rows_per_message/nats_max_rows_per_message. Они управляют количеством строк, форматируемых в одном сообщении в построчных форматах. Значение по умолчанию: 1. - Исправлено высокое потребление памяти в табличном движке NATS. - Добавлена поддержка произвольных бинарных данных в продюсере NATS (ранее он работал только со строками, содержавшими \0 в конце). - Добавлены отсутствовавшие настройки движков Kafka/RabbitMQ/NATS в документацию. - Рефакторинг логики отправки и потребления сообщений в Kafka/RabbitMQ/NATS, её отделение от семантики WriteBuffers/ReadBuffers. - Рефакторинг выходных форматов: удалены обратные вызовы на каждую строку, использовавшиеся в Kafka/RabbitMQ/NATS (теперь там callbacks не используются), разрешено непосредственное использование IRowOutputFormat, уточнены разделители конца строки и между строками, появилась возможность сбросить состояние выходного формата, чтобы начать форматирование заново. - Добавлена корректная реализация в функции formatRow (бонус после рефакторинга форматов). #42777 (Kruglov Pavel).
  • Поддержка чтения и записи таблиц типа Nested как List из Struct в формате CapnProto. Чтение и запись Decimal32/64 как Int32/64. Закрывает #43319. #43379 (Kruglov Pavel).
  • Добавлен столбец message_format_string в system.text_log. Столбец содержит шаблон, который использовался для форматирования сообщения. #44543 (Alexander Tokmakov). Это позволяет выполнять различные виды анализа логов ClickHouse.
  • Добавлена попытка автоматического определения заголовков с именами столбцов (и, возможно, типами) для форматов ввода CSV/TSV/CustomSeparated. Добавлены настройки input_format_tsv/csv/custom_detect_header, управляющие этим поведением (по умолчанию включено). Закрывает #44640. #44953 (Kruglov Pavel).

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

  • Добавлен экспериментальный инвертированный индекс как новый тип вторичного индекса для эффективного поиска по тексту. #38667 (larryluogit).
  • Добавлен экспериментальный кэш результатов запросов. #43797 (Robert Schulze).
  • Добавлена расширяемая и настраиваемая подсистема планирования для I/O-запросов (пока не интегрирована с самим I/O-кодом). #41840 (Sergei Trifonov). Эта возможность пока совершенно ничего не делает — наслаждайтесь.
  • Добавлена команда SYSTEM DROP DATABASE REPLICA, которая удаляет метаданные неработающей реплики базы данных Replicated. Закрывает #41794. #42807 (Alexander Tokmakov).

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

  • Не загружать неактивные части при запуске таблиц MergeTree. #42181 (Anton Popov).
  • Снижена задержка чтения из хранилища S3 и табличной функции s3 при работе с большим количеством мелких файлов. Теперь параметры remote_filesystem_read_method и remote_filesystem_read_prefetch применяются при чтении из хранилища S3. #43726 (Anton Popov).
  • Оптимизация чтения полей структур в файлах Parquet/ORC. Загружаются только необходимые поля. #44484 (lgbo).
  • Двухуровневый алгоритм агрегации по ошибке был отключён для запросов по HTTP. Он снова был включён, что привело к значительному росту производительности. #45450 (Nikolai Kochetov).
  • Добавлена поддержка mmap для StorageFile, что должно повысить производительность clickhouse-local. #43927 (pufit).
  • Добавлена поддержка сегментирования в HashedDictionary для параллельной загрузки (почти линейное масштабирование по числу сегментов). #40003 (Azat Khuzhin).
  • Ускорен парсинг запросов. #42284 (Raúl Marín).
  • Всегда заменяйте цепочку OR вида expr = x1 OR ... OR expr = xN на expr IN (x1, ..., xN), если expr — столбец с типом LowCardinality. Настройка optimize_min_equality_disjunction_chain_length при этом игнорируется. #42889 (Guo Wangyang).
  • Незначительно повышена производительность за счет оптимизации кода, связанного с ThreadStatus. #43586 (Zhiguo Zhou).
  • Оптимизирована по-столбцовая обработка тернарной логики за счёт авто-векторизации. В тесте производительности этого микробенчмарка было достигнуто пиковое увеличение производительности в 21 раз на платформе ICX (процессор Intel Xeon Platinum 8380). #43669 (Zhiguo Zhou).
  • По возможности избегайте установки блокировок чтения в таблице system.tables. #43840 (Raúl Marín).
  • Оптимизирован ThreadPool. Эксперименты производительности SSB (Star Schema Benchmark) на устройстве ICX (процессор Intel Xeon Platinum 8380, 80 ядер, 160 потоков) показывают, что это изменение позволяет эффективно снизить конкуренцию за мьютекс ThreadPoolImpl::mutex на 75%, увеличивая утилизацию CPU и улучшая общую производительность на 2,4%. #44308 (Zhiguo Zhou).
  • Теперь оптимизация предсказания размера хэш-таблицы применяется только в том случае, если закэшированный размер хэш-таблицы достаточно велик (пороговые значения были определены эмпирически и жестко закодированы). #44455 (Nikita Taranov).
  • Небольшое улучшение производительности при асинхронном чтении из удалённых файловых систем. #44868 (Kseniia Sumarokova).
  • Добавлен быстрый путь обработки для: - col like '%%'; - col like '%'; - col not like '%'; - col not like '%'; - match(col, '.*'). #45244 (李扬).
  • Незначительно улучшена оптимизация быстрого пути при фильтрации (оператор WHERE). #45289 (Nikita Taranov).
  • Добавлена информация о монотонности для функций toUnixTimestamp64*, чтобы включить больше алгебраических оптимизаций при анализе индексов. #44116 (Nikita Taranov).
  • Добавлена возможность настраивать использование временных данных при обработке запросов (выгрузку на диск) так, чтобы оно взаимодействовало с кешем файловой системы (используя пространство диска, выделенное под кеш) #43972 (Vladimir C). В основном это улучшает работу ClickHouse Cloud, но может использоваться и в самоуправляемых развёртываниях, если вы знаете, что делаете.
  • Таблица system.replicas теперь параллельно запрашивает статусы реплик. Закрывает #43918. #43998 (Nikolay Degterinsky).
  • Оптимизировано потребление памяти при резервном копировании в S3: файлы в S3 теперь копируются напрямую, без использования WriteBufferFromS3 (который мог использовать много памяти). #45188 (Vitaly Baranov).
  • Добавлен кэш для идентификаторов асинхронных блоков. Это уменьшит число запросов в ZooKeeper при включении дедупликации асинхронных вставок. #45106 (Han Fei).

Улучшения

  • Использовать структуру целевой таблицы вставки в generateRandom при вызове без аргументов. #45239 (Kruglov Pavel).
  • Разрешено неявное преобразование чисел с плавающей запятой, хранящихся в строковых полях JSON, в целые числа в функциях JSONExtract. Например, JSONExtract('{"a": "1000.111"}', 'a', 'UInt64') -> 1000, раньше функция возвращала 0. #45432 (Anton Popov).
  • В таблицу system.formats добавлены поля supports_parallel_parsing и supports_parallel_formatting для улучшения возможностей интроспекции. #45499 (Anton Popov).
  • Улучшено чтение полей CSV в форматах CustomSeparated и Template. Закрывает #42352 Закрывает #39620. #43332 (Kruglov Pavel).
  • Унифицированы измерения времени выполнения запросов. #43455 (Raúl Marín).
  • Улучшено автоматическое использование структуры из таблицы, в которую выполняется вставка, в табличных функциях file/hdfs/s3, когда в запросе SELECT присутствуют виртуальные столбцы; это исправляет возможную ошибку Block structure mismatch или number of columns mismatch. #43695 (Kruglov Pavel).
  • Добавлена поддержка знаковых аргументов в функции range. Исправлена ошибка #43333. #43733 (sanyu).
  • Удалено избыточное сортирование, например сортировки, связанные с предложениями ORDER BY во вложенных запросах. Реализовано на основе плана запроса. Выполняет оптимизацию, аналогичную optimize_duplicate_order_by_and_distinct в отношении предложений ORDER BY, но более общую, так как применяется к любым избыточным шагам сортировки (не только вызванным предложением ORDER BY) и к подзапросам любой глубины вложенности. Связано с #42648. #43905 (Igor Nikonov).
  • Добавлена возможность отключать дедупликацию файлов для BACKUP (для резервных копий без дедупликации можно использовать ATTACH вместо полного RESTORE). Например, BACKUP foo TO S3(...) SETTINGS deduplicate_files=0 (значение по умолчанию — deduplicate_files=1). #43947 (Azat Khuzhin).
  • Рефакторинг и улучшение определения схемы для текстовых форматов. Добавлена новая настройка schema_inference_make_columns_nullable, которая управляет преобразованием результирующих типов в Nullable (включена по умолчанию). #44019 (Kruglov Pavel).
  • Улучшена поддержка протокола PROXYv1. #44135 (Yakov Olkhovskiy).
  • Добавлена информация о последней проверке части, выполняемой потоками очистки, в таблицу system.parts. #44244 (Dmitry Novik).
  • Отключены табличные функции в режиме только для чтения для вставок. #44290 (SmitaRKulkarni).
  • Добавлена настройка simultaneous_parts_removal_limit, позволяющая ограничить количество частей, обрабатываемых за одну итерацию CleanupThread. #44461 (Dmitry Novik).
  • Не инициализируйте ReadBufferFromS3, если в запросе нужны только виртуальные столбцы, что может помочь с #44246. #44493 (chen).
  • Предотвращено появление дублирующихся подсказок для имён столбцов. Закрывает #44130. #44519 (Joanna Hulboj).
  • Разрешена подстановка макросов в endpoint для дисков. Исправлена проблема #40951. #44533 (SmitaRKulkarni).
  • Улучшено определение схемы, когда включён input_format_json_read_object_as_string. #44546 (Kruglov Pavel).
  • Добавлена настройка на уровне пользователя database_replicated_allow_replicated_engine_arguments, которая позволяет запретить создание таблиц ReplicatedMergeTree с аргументами в DatabaseReplicated. #44566 (alesapin).
  • Исключена возможность ошибочного указания пользователями нулевого (недопустимого) значения для index_granularity. Это закрывает #44536. #44578 (Alexey Milovidov).
  • Добавлена возможность задавать путь к сервисному keytab-файлу в параметре keytab секции kerberos файла config.xml. #44594 (Roman Vasin).
  • Теперь для нечеткого поиска используется уже введённая часть запроса (она передаётся в библиотеку skim, написанную на Rust и статически связанную с ClickHouse). #44600 (Azat Khuzhin).
  • Параметр input_format_json_read_objects_as_strings теперь включён по умолчанию, что позволяет считывать вложенные объекты JSON, пока тип JSON Object остаётся экспериментальным. #44657 (Kruglov Pavel).
  • Улучшена дедупликация асинхронных вставок: при повторных асинхронных вставках мы должны выполнять дедупликацию в памяти до отправки запроса к Keeper. #44682 (Han Fei).
  • Формат ввода/вывода Avro будет интерпретировать тип bool как тип bool в ClickHouse. #44684 (Kruglov Pavel).
  • Добавлена поддержка логического типа Bool в форматах Arrow/Parquet/ORC. Закрывает #43970. #44698 (Kruglov Pavel).
  • Не выполняйте жадный разбор, выходящий за пределы кавычек, при чтении UUID — это может приводить к тому, что некорректные данные будут ошибочно считаны как корректные. #44686 (Raúl Marín).
  • Определять тип UInt64 при переполнении Int64 и исправлять некоторые преобразования при выводе схемы. #44696 (Kruglov Pavel).
  • Ранее разрешение зависимостей в базе данных Replicated выполнялось не самым корректным образом, а теперь оно реализовано правильно с использованием явного графа. #44697 (Nikita Mikhaylov).
  • Исправлена ошибка, из-за которой output_format_pretty_row_numbers не сохранял счётчик между блоками. Закрывает #44815. #44832 (flynn).
  • Не учитывать ошибки в system.errors, возникающие из-за слияния частей, выполняемого параллельно с фоновым процессом очистки. #44874 (Raúl Marín).
  • Оптимизированы и исправлены метрики для асинхронного INSERT в таблицах Distributed. #44922 (Azat Khuzhin).
  • Добавлены настройки для запрета одновременного выполнения резервных копирований и восстановлений, что решает проблему #43891. Реализация: * Добавлены настройки на уровне сервера для запрета одновременного выполнения резервных копирований и восстановлений, которые считываются и устанавливаются при создании BackupWorker в Context. * По умолчанию настройки установлены в значение true. * Перед запуском резервного копирования или восстановления добавлена проверка на наличие других выполняющихся операций резервного копирования/восстановления. Для внутренних запросов проверяется, что запрос поступил с собственного узла с использованием backup_uuid. #45072 (SmitaRKulkarni).
  • Добавлен параметр конфигурации <storage_policy> для системных журналов. #45320 (Stig Bakken).

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

  • Выполнена статическая линковка с библиотекой skim (она написана на Rust) для нечеткого поиска в клиенте ClickHouse и локальной истории. #44239 (Azat Khuzhin).
  • Мы удалили поддержку динамического линкования из‑за Rust. На самом деле Rust — лишь предлог для этого удаления, и мы все равно хотели ее убрать. #44828 (Alexey Milovidov).
  • Удалена зависимость от инструмента adduser из пакетов, потому что мы его не используем. Это исправляет #44934. #45011 (Alexey Milovidov).
  • Библиотека SQLite обновлена до последней версии. Она используется для интеграционных движков базы данных и таблиц SQLite. Также исправлен ложноположительный отчет TSan. Это закрывает #45027. #45031 (Alexey Milovidov).
  • Изменения CRC-32 для устранения проблемы коллизий WeakHash на PowerPC. #45144 (MeenaRenganathan22).
  • Обновлены подмодули aws-c*. #43020 (Vitaly Baranov).
  • Автоматически объединять «зеленые» backport‑PR и «зеленые» одобренные PR. #41110 (Mikhail f. Shiryaev).
  • Создан веб‑сайт для отслеживания статуса ClickHouse CI. Source.

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

  • Доменные типы IP (IPv4, IPv6) заменены на встроенные. #43221 (Yakov Olkhovskiy). Это автоматически устраняет некоторые пробелы в реализации кода.
  • Исправлен процесс резервного копирования, если мутации принудительно завершаются во время выполнения резервной копии. #45351 (Vitaly Baranov).
  • Исправлено сообщение исключения Invalid number of rows in Chunk. #41404. #42126 (Alexander Gololobov).
  • Исправлено возможное использование неинициализированного значения при выполнении выражений после сортировки. Закрывает #43386 #43635 (Kruglov Pavel).
  • Улучшена обработка NULL в агрегатных комбинаторах, исправлены возможные ошибки: segfault (ошибка сегментации) и логическая ошибка при использовании неочевидной оптимизации optimize_rewrite_sum_if_to_count_if. Закрывает #43758. #43813 (Kruglov Pavel).
  • Исправлены ограничения для настроек запросов CREATE USER/ROLE. #43993 (Nikolay Degterinsky).
  • Исправлена ошибка с непарсируемым значением по умолчанию для столбца EPHEMERAL в метаданных таблицы. #44026 (Yakov Olkhovskiy).
  • Исправлен разбор некорректной версии из параметра совместимости. #44224 (Kruglov Pavel).
  • Привести операцию вычитания интервалов из значений datetime в соответствие с операцией их добавления. #44241 (ltrk2).
  • Сняты ограничения на максимальный размер результата для представлений. #44261 (lizhuoyu5).
  • Исправлена возможная логическая ошибка в кэше при do_not_evict_index_and_mrk_files=1. Закрывает #42142. #44268 (Kseniia Sumarokova).
  • Исправлено возможное преждевременное прекращение записи в кэш в режиме write-through (кэширование могло останавливаться из-за ошибочного предположения, хотя этого не должно было происходить). #44289 (Kseniia Sumarokova).
  • Исправлен возможный сбой при использовании функции IN с константными аргументами в качестве константного аргумента вместе с LowCardinality. Исправляет #44221. #44346 (Nikolai Kochetov).
  • Исправлена обработка сложных параметров (например, массивов) параметрических агрегатных функций. Это исправление закрывает #30975. Агрегатная функция sumMapFiltered не могла использоваться в распределённых запросах до этого изменения. #44358 (Alexey Milovidov).
  • Исправлено чтение ObjectId при определении схемы BSON. #44382 (Kruglov Pavel).
  • Исправлена гонка состояний, из-за которой временные части могли преждевременно удаляться до завершения слияния в ReplicatedMergeTree. Эта проблема могла приводить к ошибкам наподобие No such file or directory: xxx. Исправляет #43983. #44383 (alesapin).
  • Некоторые некорректные запросы SYSTEM ... ON CLUSTER вели себя неожиданным образом, если имя кластера не было указано. Это исправлено: теперь такие запросы завершаются с ошибкой SYNTAX_ERROR, как и должно быть. Исправляет #44264. #44387 (Alexander Tokmakov).
  • Исправлено чтение типа Map в формате ORC. #44400 (Kruglov Pavel).
  • Исправлена проблема с чтением столбцов, которые отсутствуют во входных данных в форматах Parquet/ORC. Ранее это могло приводить к ошибке INCORRECT_NUMBER_OF_COLUMNS. Закрывает #44333. #44405 (Kruglov Pavel).
  • Ранее функция bar использовала один и тот же символ '▋' (U+258B "Left five eighths block") для отображения как столбика 5/8, так и столбика 6/8. Это изменение исправляет это поведение: теперь для отображения столбика 6/8 используется символ '▊' (U+258A "Left three quarters block"). #44410 (Alexander Gololobov).
  • Размещение настроек профиля в конфигурационном файле после ограничений для этих настроек приводило к тому, что ограничения не применялись. #44411 (Konstantин Bogdanov).
  • Исправлена ошибка SYNTAX_ERROR при выполнении запросов EXPLAIN AST INSERT с данными. Закрывает #44207. #44413 (save-my-heart).
  • Исправлено чтение булевого значения при наличии CRLF в формате CSV. Закрывает #44401. #44442 (Kruglov Pavel).
  • Не выполнять and/or/if/multiIf над столбцом типа LowCardinality, чтобы тип результата не мог быть LowCardinality. В некоторых случаях это могло приводить к ошибке Illegal column ColumnLowCardinality. Исправляет #43603. #44469 (Kruglov Pavel).
  • Исправлена работа мутаций при использовании настройки max_streams_for_merge_tree_reading. #44472 (Anton Popov).
  • Исправлена возможная ошибка разыменования нулевого указателя при использовании GROUPING SETS в ASTSelectQuery::formatImpl (#43049). #44479 (Robert Schulze).
  • Проверять типы в аргументах табличных функций, аргументах функции CAST и при выводе схемы JSONAsObject в соответствии с настройками. #44501 (Kruglov Pavel).
  • Исправлена работа функции IN при использовании LowCardinality и константного столбца, закрыта #44503. #44506 (Duc Canh Le).
  • Исправлена ошибка при нормализации выражения DEFAULT в операторе CREATE TABLE. Второй аргумент функции in (или правый аргумент оператора IN) мог быть заменен результатом его вычисления при выполнении запроса CREATE. Исправляет #44496. #44547 (Alexander Tokmakov).
  • Проекции не работают при использовании WITH ROLLUP, WITH CUBE и WITH TOTALS. В предыдущих версиях запрос приводил к исключению вместо того, чтобы просто не использовать проекции. Это исправление закрывает #44614. Это исправление закрывает #42772. #44615 (Alexey Milovidov).
  • Асинхронные блоки не очищались, потому что функция get all blocks sorted by time не возвращала асинхронные блоки. #44651 (Han Fei).
  • Исправлено появление ошибки LOGICAL_ERROR The top step of the right pipeline should be ExpressionStep при использовании JOIN с подзапросом, UNION и TOTALS. Устранена проблема #43687. #44673 (Nikolai Kochetov).
  • Предотвращено возникновение исключения std::out_of_range в движке таблиц Executable. #44681 (Kruglov Pavel).
  • Не применять optimize_syntax_fuse_functions к квантилям в AST, закрыта #44712. #44713 (Vladimir C).
  • Исправлена ошибка, связанная с неверным типом данных в таблице Merge и PREWHERE, закрыт #43324. #44716 (Vladimir C).
  • Исправлена возможная аварийная остановка при завершении работы (во время уничтожения TraceCollector). Исправление для #44757. #44758 (Nikolai Kochetov).
  • Исправлена возможная аварийная остановка при распределённой обработке запросов. Сбой мог происходить, если запрос с totals или extremes возвращал пустой результат, а типы данных в таблице Distributed и соответствующих локальных таблицах не совпадали. Исправляет #44738. #44760 (Nikolai Kochetov).
  • Исправлена работа fsync для операций fetch (min_compressed_bytes_to_fsync_after_fetch) и небольших файлов (ttl.txt, columns.txt) при выполнении мутаций (min_rows_to_fsync_after_merge/min_compressed_bytes_to_fsync_after_merge). #44781 (Azat Khuzhin).
  • Была возможна редкая гонка состояний при выполнении запросов к таблицам system.parts или system.parts_columns во время перемещения частей между дисками. Ошибка появилась в #41145. Исправлено в #44809 (Alexey Milovidov).
  • Исправлена ошибка Context has expired, которая могла возникать при включённой оптимизации проекций. Она воспроизводилась в запросах с определёнными функциями, например dictHas/dictGet, использующими контекст во время выполнения. Исправление для #44844. #44850 (Nikolai Kochetov).
  • Исправление ошибки Cannot read all data, которая могла возникать при чтении словаря LowCardinality из удалённой файловой системы. Исправляет #44709. #44875 (Nikolai Kochetov).
  • Игнорировать ситуации, когда не удаётся прочитать датчики мониторинга оборудования, и не выводить в логах полное сообщение об исключении. #44895 (Raúl Marín).
  • Используйте значение max_delay_to_insert, если вычисленное время задержки операции INSERT превышает это значение настройки. Связано с #44902. #44916 (Igor Nikonov).
  • Исправлена ошибка Different order of columns in UNION subquery при выполнении запросов с UNION. Исправляет проблему #44866. #44920 (Nikolai Kochetov).
  • Задержка для INSERT могла рассчитываться некорректно, из‑за чего в качестве задержки всегда использовалось значение параметра max_delay_to_insert вместо правильного. Теперь используется простая формула max_delay_to_insert * (parts_over_threshold/max_allowed_parts_over_threshold), то есть задержка растёт пропорционально количеству частей сверх порога. Закрывает #44902. #44954 (Igor Nikonov).
  • Исправлена ошибка ALTER TABLE TTL, которая возникала, если у широкой части была маска легковесного удаления. #44959 (Mingliang Pan).
  • Дополнительное исправление к изменению «Replace domain IP types (IPv4, IPv6) with native» #43221. #45024 (Yakov Olkhovskiy).
  • Дополнительное исправление к изменению, заменяющему доменные типы IP (IPv4, IPv6) на встроенные https://github.com/ClickHouse/ClickHouse/pull/43221. #45043 (Yakov Olkhovskiy).
  • В парсере было возможно переполнение буфера. Найдено фаззером. #45047 (Alexey Milovidov).
  • Исправлена потенциальная ошибка cannot-read-all-data в хранилище FileLog. Закрывает #45051, #38257. #45057 (Kseniia Sumarokova).
  • Память-эффективная агрегация (настройка distributed_aggregation_memory_efficient) отключается, когда в запросе присутствуют GROUPING SETS. #45058 (Nikita Taranov).
  • Исправлен словарь RANGE_HASHED: диапазонные столбцы теперь учитываются как часть первичного ключа при обновлениях, когда указан update_field. Закрывает #44588. #45061 (Maksim Kita).
  • Исправлена ошибка Cannot capture column при захвате вложенной лямбда-функцией аргумента типа LowCardinality. Исправляет #45028. #45065 (Nikolai Kochetov).
  • Исправлен неверный результат запроса с использованием additional_table_filters (дополнительный фильтр не применялся) при использовании проекций minmax/count. #45133 (Nikolai Kochetov).
  • Исправлена ошибка в функции histogram, принимавшей отрицательные значения. #45147 (simpleton).
  • Исправлена неверная NULL-допустимость столбца в StorageJoin, закрыт #44940. #45184 (Vladimir C).
  • Исправлена ошибка перезагрузки настройки background_fetches_pool_size при её увеличении во время работы. #45189 (Raúl Marín).
  • Теперь корректно обрабатываются SELECT-запросы для KV-движков (например, KeeperMap, EmbeddedRocksDB), использующие оператор IN по ключу с подзапросом, возвращающим значение другого типа. #45215 (Antonio Andelic).
  • Исправлена логическая ошибка в SEMI JOIN и join_use_nulls в некоторых случаях, закрыты #45163 и #45209. #45230 (Vladimir C).
  • Исправлена ошибка использования освобождённой памяти (heap-use-after-free) при чтении из S3. #45253 (Kruglov Pavel).
  • Исправлена ошибка, возникающая, когда тип Avro Union имеет вид ['null', Nested type], #45275. Исправлена ошибка, из-за которой тип bytes некорректно выводился как Float. #45276 (flynn).
  • Теперь выбрасывается корректное исключение, если явный PREWHERE не может быть использован с таблицей с движком Merge. #45319 (Antonio Andelic).
  • В Ubuntu под WSL1 самораспаковывающийся дистрибутив ClickHouse не может распаковаться из‑за несоответствия: /proc/self/maps сообщает об inode 32‑битного файла, тогда как stat — о 64‑битном inode. #45339 (Yakov Olkhovskiy).
  • Исправлена гонка при запуске distributed таблицы (которая могла приводить к тому, что файл асинхронного INSERT обрабатывался несколько раз). #45360 (Azat Khuzhin).
  • Исправлена возможная аварийная остановка при чтении из хранилища S3 и при использовании табличной функции s3, если запрос ListObject завершился с ошибкой. #45371 (Anton Popov).
  • Исправлено исключение при выполнении SELECT ... FROM system.dictionaries, возникавшее, если существует словарь с некорректной структурой (например, с неправильным типом в XML-конфигурации). #45399 (Aleksei Filatov).
  • Исправлено определение схемы в s3Cluster при использовании структуры таблицы назначения в запросах INSERT INTO ... SELECT * FROM s3Cluster. #45422 (Kruglov Pavel).
  • Исправлена ошибка разбора JSON/BSONEachRow по HTTP, из-за которой для некоторых столбцов могли использоваться значения по умолчанию вместо значений из данных. #45424 (Kruglov Pavel).
  • Исправлена ошибка (Code: 632. DB::Exception: Unexpected data ... after parsed IPv6 value ...) при типизированном разборе IP-адресов из текстового источника. #45425 (Yakov Olkhovskiy).
  • закрывает #45297 Добавлена проверка на пустые регулярные выражения. #45428 (Han Fei).
  • Исправлено возможное зависание распределённого запроса. #45448 (Azat Khuzhin).
  • Исправлена возможная взаимоблокировка при включённой настройке allow_asynchronous_read_from_io_pool_for_merge_tree при возникновении исключения в ThreadPool::schedule. #45481 (Nikolai Kochetov).
  • Исправлена потенциальная проблема, при которой таблица могла оставаться используемой после DETACH. #45493 (Azat Khuzhin).
  • Исправлено редкое аварийное завершение в случае, когда запрос был отменён и при его выполнении использовался параллельный парсинг. #45498 (Anton Popov).
  • Исправлено состояние гонки между созданием distributed таблицы и выполнением INSERT в неё (оно могло приводить к ошибке CANNOT_LINK при выполнении INSERT в таблицу). #45502 (Azat Khuzhin).
  • Установлено корректное значение по умолчанию (SLRU) для геттера политики кэширования. Закрывает #45514. #45524 (Kseniia Sumarokova).
  • Запрещено использование ARRAY JOIN в мутациях, закрывает #42637 #44447 (SmitaRKulkarni).
  • Исправление обработки квалифицированных звёздочек при использовании псевдонима таблицы и трансформера столбцов. Устраняет #44736. #44755 (SmitaRKulkarni).

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

  • Оглавление
  • Релиз ClickHouse 23.12 от 2023-12-28
  • Релиз ClickHouse 23.11 от 2023-12-06
  • Релиз ClickHouse 23.10 от 2023-11-02
  • Релиз ClickHouse 23.9 от 2023-09-28
  • Релиз ClickHouse 23.8 LTS, 2023-08-31
  • Выпуск ClickHouse 23.7, 2023-07-27
  • Выпуск ClickHouse 23.6, 2023-06-29
  • Выпуск ClickHouse 23.5, 2023-06-08
  • Выпуск ClickHouse 23.4, 2023-04-26
  • Выпуск ClickHouse 23.3 LTS, 2023-03-30
  • Релиз ClickHouse 23.2 от 2023-02-23
  • Релиз ClickHouse 23.1 от 2023-01-26
  • Релиз ClickHouse 23.1
  • Журнал изменений за 2022 год