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

Содержание

Релиз 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, который позволяет выполнять 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 для генерации идентификаторов Sqids (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 вместо копирования через буфер. Улучшены операции 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 для native types. #58231 (Raúl Marín).
  • Реализована политика кэширования SLRU для файлового кэша. #57076 (Kseniia Sumarokova).
  • Лимит числа соединений с одной конечной точкой для фоновых загрузок был увеличен с 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 перенесены на уровень сервера. - Настройка keep_alive_timeout добавлена в список настроек уровня сервера. #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).
  • Добавлена поддержка флага «только для чтения» при подключении к Keeper (исправлено #53749). #57479 (Mikhail Koviazin).
  • Исправлено возможное зависание отправок в Distributed из-за “No such file or directory” (при восстановлении батча с диска). Исправлены возможные проблемы с error_count в system.distribution_queue (если distributed_directory_monitor_max_sleep_time_ms > 5min). Добавлено событие профиля для отслеживания сбоев async 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).
  • Сделано так, чтобы кэши с одинаковым path использовали одни и те же объекты кэша. Такое поведение существовало и раньше, но в версии 23.4 оно было нарушено. Если у таких кэшей с одинаковым path различается набор настроек кэша, будет сгенерировано исключение, так как это недопустимо. #58264 (Kseniia Sumarokova).
  • Параллельные реплики (экспериментальная возможность): удобные настройки #57542 (Igor Nikonov).
  • Параллельные реплики (экспериментальная возможность): улучшена обработка ответов на объявления #57749 (Igor Nikonov).
  • Параллельные реплики (экспериментальная возможность): в большей степени учитывать min_number_of_marks в ParallelReplicasReadingCoordinator #57763 (Nikita Taranov).
  • Параллельные реплики (экспериментальная возможность): отключены параллельные реплики для IN (подзапроса) #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).
  • На macOS разрешено использование связанных с Azure движков таблиц и функций. #51866 (Alexey Milovidov).
  • ClickHouse Быстрый тест теперь использует 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).
  • Исправление: в стратегии split bucket для 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, связанное с sample-блоком. #57855 (Maksim Kita).
  • В именованных коллекциях для PostgreSQL параметр addresses_expr игнорировался. #57874 (joelynch).
  • Исправлен недопустимый доступ к памяти в BLAKE3 (Rust) #57876 (Raúl Marín). Затем код переписали с Rust на C++ для повышения безопасности работы с памятью. #57994 (Raúl Marín).
  • Нормализованы имена функций в 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 для пользователя default включены access_management (управление пользователями через SQL-запросы) и named_collection_control (управление именованными коллекциями через SQL-запросы). Это закрывает #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 view или проекций с аргументами Decimal, обратитесь в службу поддержки support@clickhouse.com. Исправлена ошибка в агрегатной функции sumMap, и она стала работать примерно в 1.5..2 раза медленнее. Это не имеет значения, потому что эта функция и так, по сути, бесполезна. Это закрывает #54955. Это закрывает #53134. Это закрывает #55148. Исправлена ошибка в функции groupArraySample — в случае, когда в запросе создавалось более одного агрегатного состояния, она использовала одно и то же начальное значение генератора случайных чисел. #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).
  • Добавлена четырёхбуквенная команда для передачи лидерства/отказа от роли лидера (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).
  • В движки s3/file/hdfs/url/azureBlobStorage добавлен виртуальный столбец _size, содержащий размер файла в байтах. #57126 (Kruglov Pavel).
  • Через конечную точку 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).
  • Теперь при наличии данных в page cache мы читаем из удалённых таблиц синхронно (как и для локальных таблиц). Это быстрее, не требует синхронизации внутри пула потоков, не боится выполнять seek в локальной FS и сокращает время ожидания 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 (李扬).
  • Оптимизация простого count для формата данных 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. Это особенно полезно, когда включены операции предварительного чтения. #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 (по умолчанию отключен). При его включении для таблиц CollapsingMergeTree добавляется неявное ограничение CHECK, которое допускает в столбце Sign только значения -1 и 1. #56701. #56986 (Kevin Mingtarja).
  • Добавлена возможность добавлять новый диск в конфигурацию хранилища без перезапуска. #56367 (Duc Canh Le).
  • Добавлена поддержка создания и материализации индекса в рамках одного ALTER-запроса, а также операций “modify TTL” и “materialize TTL” в рамках одного запроса. Закрывает #55651. #56331 (flynn).
  • Добавлена новая table function 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 обновлена до release-13.0.0 с поддержкой новых кодировок. Закрывает #44505. #54800 (Kruglov Pavel).
  • Повышена производительность запросов с предложением ON CLUSTER за счёт устранения затратных системных вызовов для получения всех сетевых интерфейсов при поиске локального IP-адреса в списке hosts 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, возникавшая, если server перезапускался сразу после 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 увеличен до разумного значения, используемого в production. #56485 (Alexey Milovidov).
  • Ленивая загрузка базовых резервных копий (базовая резервная копия загружается только при необходимости). Также добавлены сообщения в лог и profile events для резервных копий. #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).
  • Перезапись условия равенства с проверкой is null в разделе JOIN ON. Только для экспериментального анализатора. #56538 (vdimir).
  • Функция concat теперь поддерживает произвольные типы аргументов (а не только аргументы типов String и FixedString). Благодаря этому её поведение стало больше похоже на реализацию concat в MySQL. Например, SELECT concat('ab', 42) теперь возвращает ab42. #56540 (Serge Klochkov).
  • Разрешено получать конфигурацию cache из раздела ‘named_collection’ в конфигурационном файле или из named collections, созданных в SQL. #56541 (Kseniia Sumarokova).
  • Движок базы данных PostgreSQL: удаление устаревших таблиц стало менее агрессивным при неудачном подключении к PostgreSQL. #56609 (jsc0218).
  • Подключение к PG при неверном 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. Буферизация сжатого блока в редких случаях, когда ёмкости выходного буфера недостаточно для записи сжатого блока напрямую в буфер out. #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).
  • Код завершения сервера будет соответствовать коду исключения. Например, если server не может запуститься из-за ограничения памяти, он завершится с кодом 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 fault теперь выполняется с переключением на программный путь. #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).
  • В CI для тестов S3 включен temporary_data_in_cache. #48425 (vdimir).
  • В CI для clickhouse-client установлено максимальное использование памяти (1G). #56873 (Nikita Mikhaylov).

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

  • Исправлен экспериментальный анализатор: при вставке из SELECT с подзапросом, ссылающимся на таблицу, в которую выполняется вставка, должен обрабатываться только блок вставки. #50857 (Yakov Olkhovskiy).
  • Исправлена ошибка в функции str_to_map. #56423 (Arthur Passos).
  • Keeper reconfig: добавить тайм-аут перед уступкой/получением роли лидера #53481 (Mike Kot).
  • Исправлен некорректный заголовок в grace hash JOIN и при pushdown фильтра #53922 (vdimir).
  • Выборка из системных таблиц, если таблица основана на табличной функции. #55540 (MikhailBurdukov).
  • RFC: исправлено “Не удаётся найти столбец X в потоке-источнике” для распределённых запросов с 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).
  • Исправлен сбой сегментации во время инициализации 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 COLLECTION #56494 (Nikolay Degterinsky).
  • Исправлены две ошибки в анализе проекций. #56502 (Amos Bird).
  • Исправлена обработка псевдонимов в кэше запросов #56545 (Robert Schulze).
  • Исправлено преобразование Nullable(Enum) в Nullable(String) #56644 (Nikolay Degterinsky).
  • Более надежная обработка логов в Keeper #56670 (Antonio Andelic).
  • Исправлено слияние конфигураций для узлов с атрибутами подстановки #56694 (Konstantin Bogdanov).
  • Исправлено повторное использование table function input(). #56695 (Nikolai Kochetov).
  • Исправление: устранена проблема с динамической загрузкой OpenSSL в RabbitMQ #56703 (Igor Nikonov).
  • Исправлен сбой в кодеке GCD в случае наличия нулей в данных #56704 (Nikita Mikhaylov).
  • Исправлено ‘не удалось заблокировать mutex: некорректный аргумент’ в clickhouse-local при вставке в функцию #56710 (Kruglov Pavel).
  • Исправлен разбор текстового представления Date в оптимистичном пути #56765 (Kruglov Pavel).
  • Исправлен сбой в кодеке FPC #56795 (Alexey Milovidov).
  • DatabaseReplicated: устранён тайм-аут DDL-запроса после восстановления реплики #56796 (Alexander Tokmakov).
  • Исправлено некорректное отображение столбцов с типом Nullable в бинарном протоколе MySQL #56799 (Serge Klochkov).
  • Добавлена поддержка файлов метаданных Iceberg для таблиц metastore #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 #56948 (Amos Bird).
  • Исправлена валидация пути к файлу sqlite #56984 (San).
  • S3Queue: исправлено увеличение счётчика ссылок на метаданные #56990 (Kseniia Sumarokova).
  • Небольшое исправление для S3Queue #56999 (Kseniia Sumarokova).
  • Исправлена проверка пути к файлу в DatabaseFileSystem #57029 (San).
  • Исправлена ошибка в fuzzBits при ARRAY JOIN #57033 (Antonio Andelic).
  • Исправлено разыменование nullptr в частичном соединении слиянием с 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: добавлено ограничение на фоновую загрузку #57424 (Kseniia Sumarokova).

Релиз ClickHouse 23.10, 2023-11-02. Презентация, Видео

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

  • Возможность автоматически удалять поврежденные части данных больше недоступна. Это закрывает #55174. #55184 (Alexey Milovidov). #55557 (Jihyuk Bok).
  • Устаревшие части данных в памяти больше нельзя читать из журнала предзаписи. Если ранее у вас были настроены части в памяти, их необходимо удалить перед обновлением. #55186 (Alexey Milovidov).
  • Удалена интеграция с Meilisearch. Причина: она была совместима только со старой версией 0.18. В новых версиях Meilisearch протокол изменился, и интеграция больше не работает. Примечание: будем признательны, если вы поможете вернуть её. #55189 (Alexey Milovidov).
  • Концепция directory monitor переименована в background INSERT. Все настройки *directory_monitor* были переименованы в distributed_background_insert*. Обратная совместимость должна сохраниться (так как старые настройки были добавлены как alias). #55978 (Azat Khuzhin).
  • send_timeout, заданный на стороне клиента, больше не интерпретируется как receive_timeout на стороне сервера, и наоборот. #56035 (Azat Khuzhin).
  • Сравнение интервалов времени с разными единицами теперь будет генерировать исключение. Это закрывает #55942. Возможно, в отдельных случаях вы полагались на прежнее поведение, когда сравнивались базовые числовые значения без учета единиц измерения. #56090 (Alexey Milovidov).
  • Экспериментальный движок таблицы S3Queue был полностью переработан: изменен способ хранения информации в ZooKeeper, что позволяет сократить количество запросов к ZooKeeper; добавлено кэширование состояния ZooKeeper в случаях, когда известно, что оно не изменится; улучшен процесс опроса S3, чтобы сделать его менее агрессивным; изменен способ управления TTL и max set для trached files — теперь этим занимается фоновый процесс. Добавлены таблицы 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, которая возвращает количество всех дочерних узлов по указанному path. #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 на уровне групп строк. #55330 (李扬).
  • Повышена производительность внешней агрегации при большом количестве временных файлов. #55489 (Maksim Kita).
  • По умолчанию для кэша marks вторичных индексов установлен разумный размер, чтобы не загружать marks повторно. #55654 (Alexey Milovidov).
  • Устранена лишняя реконструкция гранул индекса при чтении индексов пропуска данных. Это исправляет #55653. #55683 (Amos Bird).
  • Кэширование CAST в set во время выполнения для повышения производительности функции IN, когда тип элемента set не в точности совпадает с типом столбца. #55712 (Duc Canh Le).
  • Повышена производительность ColumnVector::insertMany и ColumnVector::insertManyFrom. #55714 (frinkr).
  • Оптимизированы операции индексирования Map за счёт предсказания положения ключа в следующей строке и сокращения числа сравнений. #55929 (lgbo).
  • Добавлена поддержка отсечения полей struct в 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 при большом количестве наблюдений потоки AsyncMetrics могут в течение заметного времени потреблять 100% CPU в DB::KeeperStorage::getSessionsWithWatchesCount. Исправление позволяет избежать обхода крупных множеств watches и list_watches. #56054 (Alexander Gololobov).
  • Добавлена настройка optimize_trivial_approximate_count_query, позволяющая использовать приближённый count для хранилища EmbeddedRocksDB. Для StorageJoin включён тривиальный count. #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).
  • Пока что анализ проекций будет выполняться только на основе плана запроса. Настройка 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”, если строк нет и было сгенерировано исключение. #55240 (Salvatore Mesoraca).
  • Поддерживается переименование table без ключевого слова TABLE, например RENAME db.t1 to db.t2. #55373 (凌涛).
  • В system.clusters добавлен internal_replication. #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 отключён, он позволяет читать строки, помеченные как удалённые запросами легковесного DELETE. Это полезно для отладки. #55952 (Alexander Gololobov).
  • Разрешён пропуск значений null при сериализации Tuple в объекты JSON, что позволяет сохранить совместимость с функцией to_json в Spark и также полезно для 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).
  • Для Apache DataSketches теперь используется основной репозиторий. #55787 (Nikita Taranov).

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

  • Пропуск создания жёстких ссылок для файлов инвертированного индекса при мутации #47663 (cangyin).
  • Исправлена ошибка в функции match (regex): шаблон регулярного выражения, содержащий альтернативы, приводит к формированию некорректного условия по ключу. Закрывает #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 cache #55252 (Kseniia Sumarokova).
  • Предотвращены возможные утечки памяти в компрессорах при отсутствии финализации буфера #55262 (Azat Khuzhin).
  • Исправлено выполнение функций над разреженными столбцами #55275 (Azat Khuzhin).
  • Исправлено некорректное слияние Nested в SELECT FINAL FROM SummingMergeTree #55276 (Azat Khuzhin).
  • Исправлена ошибка, из-за которой в replicated merge tree поверх S3 без zero copy было невозможно удалить отсоединённую партицию #55309 (alesapin).
  • Исправлен сбой в MergeSortingPartialResultTransform (из-за отсутствия фрагментов после remerge) #55335 (Azat Khuzhin).
  • Исправлена гонка данных в CreatingSetsTransform (при ошибках), возникавшая при выбрасывании общего исключения #55338 (Azat Khuzhin).
  • Исправлена неудачная оптимизация (до определённой степени) #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).
  • Исправлен индикатор прогресса для Cluster-функций s3 и azure с URL-адресом без глоб-шаблонов #55666 (Kruglov Pavel).
  • Исправлена фильтрация по виртуальным столбцам с оператором OR в запросе (повторная отправка) #55678 (Azat Khuzhin).
  • Исправления и улучшения хранилища Iceberg #55695 (Kruglov Pavel).
  • Исправлена состояние гонки данных в CreatingSetsTransform (v2) #55786 (Azat Khuzhin).
  • Генерировать исключение при попытке разобрать недопустимую строку как число с плавающей запятой, если precise_float_parsing равно true #55861 (李扬).
  • Отключён pushdown предикатов, если CTE содержит функции с сохранением состояния #55871 (Raúl Marín).
  • Исправлена ошибка в normalize ASTSelectWithUnionQuery: она удаляла FORMAT из запроса #55887 (flynn).
  • Попытка устранить возможный segfault во входном формате Native ORC #55891 (Kruglov Pavel).
  • Исправлены оконные функции для разреженных столбцов. #55895 (János Benjamin Antal).
  • исправлено: StorageNull поддерживает подстолбцы #55912 (FFish).
  • Не записывать в журнал ошибок ошибки, допускающие повторную попытку, для операций Replicated mutate/merge #55944 (Azat Khuzhin).
  • Исправлена работа SHOW DATABASES LIMIT <N> #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).
  • Исправлен кэш схемы для fallback JSON->JSONEachRow при изменении настроек #56172 (Kruglov Pavel).
  • Добавлен обработчик ошибок для odbc-bridge #56185 (Yakov Olkhovskiy).

Релиз ClickHouse 23.9, 2023-09-28. Презентация, Видео

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

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

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

  • Улучшен вывод схемы для форматов JSON: 1) Теперь можно выводить именованные Tuple из объектов JSON без экспериментального JSON type с помощью настройки input_format_json_try_infer_named_tuples_from_objects в форматах JSON. Ранее без экспериментального JSON type объекты 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 для удалённых дисков. Конфигурация хранилища для дисков типов s3, s3_plain, hdfs и azure_blob_storage теперь может содержать элементы read_resource и write_resource с именами ресурсов. Политики планирования для этих ресурсов можно настраивать в отдельном разделе конфигурации сервера resources. Запросы можно помечать с помощью настройки workload и классифицировать с помощью раздела конфигурации сервера workload_classifiers, чтобы решать различные задачи планирования ресурсов. Подробнее см. в документации. #47009 (Sergei Trifonov). Добавлен тип узла планировщика IO “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) теперь поддерживают аргументы timezone, не являющиеся константами. #53680 (Yarik Briukhovetskyi).
  • Добавлена поддержка ALTER TABLE MODIFY COMMENT. Примечание: нечто похожее уже давно было добавлено сторонним участником, но эта возможность вообще не работала и только вводила пользователей в заблуждение. Это закрывает #36377. #51304 (Alexey Milovidov). Примечание: эта команда не распространяется между репликами, поэтому у реплик одной таблицы могут быть разные комментарии.
  • Добавлен GCD, также известный как “наибольший общий делитель”, — новый кодек сжатия данных. Кодек вычисляет 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).
  • В clickhouse-client добавлена поддержка SHOW FUNCTIONS. #54337 (Julia Kartseva).
  • Добавлена функция toDaysSinceYearZero с alias 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 и version в отдельных частях без необходимости для запросов с FINAL. #53919 (Duc Canh Le).
  • Оптимизирован GROUP BY по константным ключам. После 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 Taranov).
  • Исправлена высокая нагрузка на CPU при работе с NATS. #54399 (Vasilev Pyotr).
  • Поскольку для выполнения toString с аргументом datetime используются отдельные инструкции, это позволяет немного повысить производительность для аргументов, не относящихся к datetime, и сделать некоторые части кода чище. Продолжение #53680. #54443 (Yarik Briukhovetskyi).
  • Вместо сериализации элементов json в std::stringstream в этом PR сделана попытка записывать результат сериализации напрямую в ColumnString. #54613 (lgbo).
  • Включена оптимизация ORDER BY для чтения данных в соответствующем порядке из таблицы MergeTree, если доступ к таблице осуществляется через представление. #54628 (Vitaly Baranov).
  • Улучшены SQL-функции для JSON за счёт повторного использования GeneratorJSONPath и удаления нескольких общих указателей. #54735 (lgbo).
  • Keeper старается объединять запросы flush в батчи для повышения производительности. #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).
  • При array join теперь учитывается max_block_size, чтобы избежать возможного OOM. Закрывает #54290. #54664 (李扬).
  • Повторное использование HTTP-соединений в табличной функции s3. #54812 (Michael Kolupaev).
  • Линейный поиск в MergeTreeRangeReader::Stream::ceilRowsToCompleteGranules заменён двоичным поиском. #54869 (usurai).

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

  • Создание индексов Annoy теперь можно распараллелить с использованием настройки max_threads_for_annoy_index_creation. #54047 (Robert Schulze).
  • Параллельные реплики при работе с Distributed не читают данные со всех реплик #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, возникавшая в крайне редких случаях: иногда после выполнения DROP TABLE движок таблицы EmbeddedRocksDB некорректно закрывает файлы в NFS. #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).
  • В HTTP-заголовки X-ClickHouse-Progress и X-ClickHouse-Summary добавлено поле elapsed_ns. #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. Теперь это также работает для вложенных типов, таких как Array внутри Array, и для функций, таких как map/tuple. Проблема: #51236. #54553 (Kruglov Pavel).
  • Добавлены операции умножения, деления и взятия остатка по модулю для массивов и скаляров. Работает в обе стороны, например 5 * [5, 5] и [5, 5] * 5 — возможны оба варианта. #54608 (Yarik Briukhovetskyi).
  • В команду rm в keeper-client добавлен необязательный аргумент version, чтобы сделать удаление безопаснее. #54708 (János Benjamin Antal).
  • Отключено завершение работы сервера со стороны systemd (это может привести к потере данных при использовании таблиц Buffer). #54744 (Azat Khuzhin).
  • В системную таблицу system.functions добавлено поле is_deterministic, которое указывает, будет ли результат функции одинаковым при двух вызовах с точно одинаковыми входными данными. #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/…, исправлена вставка в эфемерные столбцы из файлов. Закрывает #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. INTERVAL 2 HOURS должен быть эквивалентен INTERVAL 2 HOUR. #54860 (Jordi Villar).
  • Всегда разрешать создание проекции с Nullable PK. Это исправляет #54814. #54895 (Amos Bird).
  • Повторные попытки S3-операций резервного копирования после сбоя из-за сброса соединения. #54900 (Vitaly Baranov).
  • Сделано более точным сообщение об исключении в случае, когда максимальное значение настройки меньше минимального. #54925 (János Benjamin Antal).
  • LIKE, match и другие функции сопоставления по регулярным выражениям теперь поддерживают сопоставление с шаблонами, содержащими не-UTF-8 подстроки, с переходом на двоичное сопоставление. Example: можно использовать 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 для lookup-операций (tldLookup.generated.cpp). #54269 (Bharat Nallan).
  • Удалена лишняя символическая ссылка clickhouse-keeper-client. #54587 (Tomas Barton).
  • Для поиска bash теперь используется /usr/bin/env — благодаря этому появилась поддержка Nix OS. #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 декодирует их по возможности. RFC-4648 оставляет открытым вопрос, обязателен ли паддинг, но в зависимости от контекста это может быть изменением поведения, о котором стоит знать. #54119 (Mikhail Koviazin).

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

  • Исправлена работа REPLACE/MOVE PARTITION при zero-copy-репликации (примечание: zero-copy-репликация — экспериментальная возможность) #54193 (Alexander Tokmakov).
  • Исправлены блокировки zero-copy при использовании жёстких ссылок (примечание: “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).
  • Исправлен троттлинг ввода-вывода при копировании каталогов целиком #53338 (Azat Khuzhin).
  • Исправление: действия, перенесённые в условие PREWHERE, могут терять столбец #53492 (Yakov Olkhovskiy).
  • Исправлена внутренняя ошибка при замене побайтно идентичными частями #53735 (Pedro Riera).
  • Исправление: теперь требуются столбцы, участвующие в выражении interpolate #53754 (Yakov Olkhovskiy).
  • Исправлены инициализация Cluster Discovery и настройка точек отказа в конфигурации #54113 (vdimir).
  • Исправлены ошибки в accurateCastOrNull #54136 (Salvatore Mesoraca).
  • Исправлена ошибка при использовании Nullable в первичном ключе с модификатором FINAL #54164 (Amos Bird).
  • Исправлена ошибка, из-за которой при наличии дублирующихся данных была невозможна вставка новых данных в реплицированное materialized view. #54184 (Pedro Riera).
  • Исправление: разрешено использовать IPv6 в фильтре Блума #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).
  • Исправлен сбой сегментации при AST-оптимизации функции arrayExists #54379 (Nikolay Degterinsky).
  • Проверка переполнения перед сложением в функции analysisOfVariance #54385 (Antonio Andelic).
  • Воспроизведена и устранена ошибка в removeSharedRecursive #54430 (Sema Checherinda).
  • Исправлена возможная некорректная работа SimpleAggregateFunction в PREWHERE и FINAL #54436 (Azat Khuzhin).
  • Исправлена фильтрация частей с indexHint при отключённом анализаторе #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).
  • Исправлено использование структуры таблиц, в которые выполняется вставка, в случае значений по умолчанию и явного указания столбцов для вставки #54655 (Kruglov Pavel).
  • Исправление: больше не используется сопоставление с регулярным выражением, которое может содержать альтернативы, в качестве ключевого условия. #54696 (Yakov Olkhovskiy).
  • Исправлена ошибка в ReplacingMergeTree при вертикальном слиянии и очистке #54706 (SmitaRKulkarni).
  • Исправлены виртуальные столбцы с некорректными значениями после ORDER BY #54811 (Michael Kolupaev).
  • Исправлена фильтрация частей с indexHint без анализатора #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 в Map скалярного результата при пустом результате подзапроса #52240 (vdimir).
  • Исправлена ошибка: в редком случае FINAL приводил к формированию некорректных диапазонов чтения #54934 (Nikita Taranov).
  • Исправлено: повторные попытки при вставке с кворумом без Keeper #55026 (Igor Nikonov).
  • Исправлено простое state с Nullable #55030 (Pedro Riera).

Релиз ClickHouse 23.8 LTS, 2023-08-31. Презентация, Видео

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

  • Если у динамического диска есть имя, его следует указывать в аргументах функции диска как disk = disk(name = 'disk_name', …). В предыдущей версии можно было указывать disk = disk_<disk_name>(...), но этот вариант больше не поддерживается. #52820 (Kseniia Sumarokova).
  • clickhouse-benchmark будет устанавливать соединения параллельно, если он запущен с --concurrency больше единицы. Ранее его было невозможно использовать при запуске с 1000 параллельными соединениями из Европы в США. Исправлен расчёт QPS для соединений с высокой задержкой. Обратно несовместимое изменение: опция вывода JSON для clickhouse-benchmark удалена. Если вы использовали эту опцию, в качестве обходного решения можно извлекать данные из system.query_log в формате JSON. #53293 (Alexey Milovidov).
  • Столбец microseconds удалён из system.text_log, а столбец milliseconds — из system.metric_log, поскольку они избыточны при наличии столбца event_time_microseconds. #53601 (Alexey Milovidov).
  • Возможность metadata cache объявлена устаревшей. Она экспериментальная, и мы никогда её не использовали. Эта возможность опасна: #51182. Удалена системная таблица system.merge_tree_metadata_cache. 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, которая позволяет строить флеймграф с выделенной, но не освобождённой памятью. Переработка #38391. #45322 (Nikolai Kochetov).
  • Добавлена табличная функция azureBlobStorageCluster. Набор поддерживаемых возможностей очень похож на набор возможностей табличной функции s3Cluster. #50795 (SmitaRKulkarni).
  • Разрешено использовать cluster, clusterAllReplicas, remote и remoteSecure без имени таблицы в issue #50808. #50848 (Yangkuan Liu).
  • Системная таблица для мониторинга консьюмеров Kafka. #50999 (Ilya Golshtein).
  • Добавлена настройка max_sessions_for_user. #51724 (Alexey Gerasimchuck).
  • Новые функции toUTCTimestamp/fromUTCTimestamp, работающие так же, как to_utc_timestamp/from_utc_timestamp в Spark. #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).
  • В system.clusters добавлен столбец name как псевдоним 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). Пока она предназначена только для тех, кто продолжает работать над реализацией. Не используйте её.

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

  • Pushdown фильтров Parquet. То есть при чтении файлов Parquet группы строк (фрагменты файла) пропускаются на основе условия WHERE и минимальных/максимальных значений в каждом столбце. В частности, если файл приблизительно отсортирован по какому-то столбцу, запросы с фильтрацией по узкому диапазону значений этого столбца будут выполняться гораздо быстрее. #52951 (Michael Kolupaev).
  • Оптимизировано чтение небольших групп строк в Parquet за счёт объединения их в батчи. Закрывает #53069. #53281 (Kruglov Pavel).
  • Оптимизирован подсчёт строк в файлах для большинства входных форматов. Закрывает #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(String) при использовании большого количества ключей переменной длины. #51399 (LiuNeng).
  • В Analyzer добавлен этап оптимизации временного фильтра с preimage. Эксперименты по производительности SSB на системе ICX (Intel Xeon Platinum 8380 CPU, 80 ядер, 160 потоков) показывают, что это изменение может повысить геометрическое среднее QPS на 8,5% при включенном экспериментальном Analyzer. #52091 (Zhiguo Zhou).
  • Ускорено слияние, если в функции uniqExact (COUNT DISTINCT) все хеш-множества одноуровневые. #52973 (Jiebin Sun).
  • движок таблицы Join: структура данных hash join больше не клонируется вместе со всеми столбцами. #53046 (Duc Canh Le).
  • Реализован нативный входной формат ORC без библиотеки “apache arrow” для повышения производительности. #53324 (李扬).
  • Панель мониторинга будет указывать серверу сжимать данные, что полезно для больших временных диапазонов при медленном интернет-соединении. Например, один график с 86400 точками может занимать 1.5 MB без сжатия и 60 KB в сжатом виде при использовании br. #53569 (Alexey Milovidov).
  • Более эффективное использование пула потоков для резервного копирования и восстановления. #53649 (Nikita Mikhaylov).
  • Метаданные файлового кэша при запуске теперь загружаются параллельно. Настраивается параметром конфигурации кэша load_metadata_threads (по умолчанию: 1). Связано с #52037. #52943 (Kseniia Sumarokova).
  • Улучшена работа move_primary_key_columns_to_end_of_prewhere. #53337 (Han Fei).
  • Это оптимизирует взаимодействие с ClickHouse Keeper. Раньше вызывающий код мог зарегистрировать один и тот же callback наблюдения несколько раз. В таком случае каждая такая запись занимала память, а один и тот же callback вызывался многократно, что было не очень логично. Чтобы избежать этого, вызывающий код мог содержать дополнительную логику, не позволяющую добавлять одно и то же наблюдение несколько раз. Теперь такая дедупликация выполняется внутри, если 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 или сгенерировать исключение), если в stderr внешней команды есть данные. Это упрощает отладку внешних команд. #43210 (Amos Bird).
  • Добавлен столбец partition в таблицы system part_log и merge. #48990 (Jianfei Hu).
  • Размеры кэшей несжатых данных/меток (индекса), 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” добавляется после включения контейнера Azure в URL. #51141 (SmitaRKulkarni).
  • Исправлено описание фильтрации множеств Set в алгоритме JOIN full_sorting_merge. #51329 (Tanay Tummalapalli).
  • Исправлена проблема с потреблением памяти в Aggregator, когда max_block_size очень велик. #51566 (Nikita Taranov).
  • Добавлена команда SYSTEM SYNC FILESYSTEM CACHE. Она сравнивает состояние файлового кэша в памяти с данными на диске и при необходимости исправляет состояние в памяти. Это требуется только при ручном вмешательстве в данные на диске, что крайне не рекомендуется. #51622 (Kseniia Sumarokova).
  • Попытка создать универсальный резолвер прокси для CH с сохранением обратной совместимости с существующим резолвером прокси в конфигурации хранилища S3. #51749 (Arthur Passos).
  • Поддержка чтения подстолбцов Tuple из табличных функций 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 может считывать большой объём данных, и нет смысла помещать все эти данные в файловый кэш, чтобы сразу же их оттуда вытеснить). #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 и INFORMATION_SCHEMA. #52695 (Yarik Briukhovetskyi).
  • Запрос CHECK TABLE работает быстрее и удобнее в использовании (отправляет обновления о ходе выполнения, его можно отменить). #52745 (vdimir).
  • Добавлена поддержка modulo, intDiv, intDivOrZero для Tuple с применением к каждому элементу Tuple. #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 (symlink) те же пути по умолчанию, что и для clickhouse-keeper (executable). #52861 (Vitaly Baranov).
  • Улучшено сообщение об ошибке для table function 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).
  • Добавлена диагностическая информация об имени файла при выводе схемы — это помогает при обработке нескольких файлов с помощью глоб-шаблонов. #53135 (Alexey Milovidov).
  • Клиент будет загружать предложения через основное соединение, если второму соединению не разрешено создавать сеанс. #53177 (Alexey Gerasimchuck).
  • В запрос SYSTEM STOP/START LISTEN QUERIES [ALL/DEFAULT/CUSTOM] добавлен оператор EXCEPT, например SYSTEM STOP LISTEN QUERIES ALL EXCEPT TCP, HTTP. #53280 (Nikolay Degterinsky).
  • Изменено значение max_concurrent_queries по умолчанию со 100 на 1000. Допустимо иметь много одновременных запросов, если они не тяжёлые и в основном ждут ответа по сети. Примечание: не путайте количество одновременных запросов и QPS: например, ClickHouse server может обрабатывать десятки тысяч 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).
  • Добавлена возможность отключить flush таблиц 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 и на панели мониторинга не будет использовать Grammarly. #53614 (Alexey Milovidov).
  • В экспертных настройках теперь можно (1) настраивать size_ratio (то есть относительный размер защищённой очереди) для кэшей [индекса] mark/uncompressed, (2) настраивать политику кэширования для кэшей index mark и index uncompressed. #53657 (Robert Schulze).
  • Добавлена проверка информации о клиенте в пакете запроса в TCPHandler. #53673 (Alexey Gerasimchuck).
  • Добавлены повторные попытки загрузки частей в случае сетевых ошибок при взаимодействии с Microsoft Azure. #53750 (SmitaRKulkarni).
  • Стек вызовов для исключений; исключения материализованных представлений теперь пробрасываются дальше. #53766 (Ilya Golshtein).
  • Если hostname или порт не указаны, клиент 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).
  • В CI добавлен https://github.com/elliotchance/sqltest для отчёта о соответствии стандарту 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 при тестах с сохранением состояния в ClickHouse Cloud. #53351 (Alexey Milovidov).
  • Экспорт журналов из CI во время стресс-тестов. #53353 (Alexey Milovidov).
  • Экспорт журналов из CI в фаззере. #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).
  • Исправлена контрольная сумма для сжатых marks #51777 (SmitaRKulkarni).
  • Исправлен ошибочный разбор запятой как части значения datetime при best effort-парсинге CSV #51950 (Kruglov Pavel).
  • Не генерировать исключение, если у исполняемой UDF есть параметры #51961 (Nikita Taranov).
  • Исправлен пересчёт индексов пропуска данных и проекций в запросах 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).
  • Исправлена сортировка разреженных столбцов при большом LIMIT #52827 (Anton Popov).
  • clickhouse-keeper: исправлена реализация server с использованием poll. #52833 (Andy Fiddaman).
  • Анализатор regexp теперь распознаёт именованные группы захвата #52840 (Han Fei).
  • Устранён возможный assert в ~PushingAsyncPipelineExecutor в clickhouse-local #52862 (Kruglov Pavel).
  • Исправлено чтение пустых Nested(Array(LowCardinality(...))) #52949 (Anton Popov).
  • Добавлены новые тесты для session_log и исправлена несогласованность между входом в систему и выходом из неё. #52958 (Alexey Gerasimchuck).
  • Исправлена утечка пароля в команде show create mysql table #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).
  • Сначала сбрасывать очередь async insert при завершении работы #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).
  • Корректная обработка итогов и экстремумов с DelayedSource #53644 (Antonio Andelic).
  • Зависание кэша подготовленных Set в конвейере мутаций #53645 (Nikolai Kochetov).
  • Исправлена ошибка в мутациях с подстолбцами типа JSON, используемыми в предикатах запросов UPDATE и DELETE. #53677 (VanDarkholme7).
  • Исправлен pushdown фильтра в JOIN full_sorting_merge #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.partslast_removal_attemp_time. Теперь он называется last_removal_attempt_time. #52104 (filimonov).
  • Версия distributed_ddl_entry_format_version по умолчанию повышена до 5 (это включает сквозную передачу OpenTelemetry и initial_query_idd). После downgrade это не позволит обрабатывать существующие записи distributed DDL (но обратите внимание, что обычно таких необработанных записей быть не должно). #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).
  • Добавлена поддержка глоб-шаблонов ({}) для выбора нескольких каталогов. #50559 (Andrey Zvonov).
  • Коннектор Kafka может получать схему Avro из Schema Registry с использованием базовой аутентификации и 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 для отображения статистики по bin’ам 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).
  • Реализовано форматирование типа данных Interval в стиле KQL. Это нужно только для совместимости с языком запросов 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).
  • Расширен pushdown для правой части JOIN. #50532 (Nikita Taranov).
  • Улучшен grace_hash JOIN за счёт предварительного резервирования размера хеш-таблицы (повторно отправлено). #50875 (lgbo).
  • Ожидание блокировки в OpenedFileCache иногда могло быть ощутимым. Чтобы избежать конкуренции за блокировку, мы разделили его на несколько подотображений (каждое со своей собственной блокировкой). #51341 (Nikita Taranov).
  • Условия со столбцами первичного ключа перенесены в конец цепочки PREWHERE. Идея в том, что условия со столбцами PK, вероятно, будут использоваться при анализе PK и мало что добавят к фильтрации PREWHERE. #51958 (Alexander Gololobov).
  • Ускорен COUNT(DISTINCT) для типов String за счёт встраивания SipHash. Эксперименты по производительности OnTime на платформе ICX (Intel Xeon Platinum 8380 CPU, 80 ядер, 160 потоков) показывают, что это изменение может повысить QPS запроса Q8 на 11.6%, не влияя на остальные. #52036 (Zhiguo Zhou).
  • По умолчанию включён allow_vertical_merges_from_compact_to_wide_parts. Это позволит сократить использование памяти при слиянии. #52295 (Alexey Milovidov).
  • Исправлен некорректный анализ проекций, из-за которого нарушалась корректность первичных ключей. Эта проблема возникает только при 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. Также в этом PR значение max_file_segment_size было увеличено с 8Mi до 32Mi. #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 (настройка allow_s3_native_copy для BACKUP/RESTORE и 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).
  • В system.parts_columns добавлен столбец modification_time. #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).
  • Словарь типа cache теперь запрашивает у источника только уникальные ключи. Закрывает #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) В MaterializedMySQL теперь поддерживается CREATE TABLE ... AS SELECT .. #52067 (Val Doroshchuk).
  • (experimental MaterializedMySQL) В MaterializedMySQL добавлено автоматическое преобразование текстовых типов в utf8. #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).
  • Для ClickHouse Keeper добавлена поддержка команды ZooKeeper reconfig с инкрементальной реконфигурацией, которую можно включить с помощью настройки keeper_server.enable_reconfiguration. Поддерживаются добавление и удаление серверов, а также изменение их приоритетов. #49450 (Mike Kot). Предполагается, что эта возможность пока реализована не полностью.

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

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

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

  • Исправлена работа syncTables в MaterializedPostgreSQL #49698 (Kseniia Sumarokova).
  • Исправлена ошибка в проекциях при использовании 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).
  • Устранено несоответствие структуры блока в 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 JOIN #51633 (vdimir).
  • Исправлена проблема с async insert и дедупликацией для ReplicatedMergeTree при использовании алгоритмов слияния #51676 (Antonio Andelic).
  • Исправлено чтение из пустого столбца в функции parseSipHashKey #51804 (Nikita Taranov).
  • Исправлен segfault при создании некорректной таблицы 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).
  • Проверять счётчик ссылок в RemoveManyObjectStorageOperation::finalize, а не в execute #51954 (vdimir).
  • Добавлена поддержка параметрических пользовательских функций (UDF) #51964 (Alexey Milovidov).
  • Небольшое исправление функции toDateTime64() для дат после 2283-12-31 #52130 (Andrey Zvonov).
  • Исправлен кортеж в ORDER BY для оконных функций #52145 (Alexey Milovidov).
  • Исправлен некорректный анализ проекции, когда агрегирующее выражение содержит монотонные функции #52151 (Amos Bird).
  • Исправлена ошибка в функции groupArrayMoving #52161 (Alexey Milovidov).
  • Отключён Direct JOIN для словаря с диапазонами #52187 (Duc Canh Le).
  • Исправлен тест для залипающих мутаций (и крайне редкое состояние гонки) #52197 (alesapin).
  • Исправлено состояние гонки в Web disk #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).
  • Исправлена возможная ошибка “Не удается закрыть соединения: сначала отмените запрос” #52585 (Kruglov Pavel).

Релиз ClickHouse 23.6, 2023-06-29. Презентация, Видео

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

  • Удалена возможность do_not_evict_index_and_mark_files в fs cache. Она только ухудшала ситуацию. #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 в clause 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).
  • Реализовано проталкивание фильтра через 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 и хранилищ, состоящих только из одного блока. #50214 (Azat Khuzhin).
  • Смержен PR #46558. Исключена перестановка блока при сортировке, если блок уже отсортирован. #50697 (Alexey Milovidov, Maksim Kita).
  • Для ускорения чтения из таблицы system.zookeeper несколько list-запросов к 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).
  • Добавлена случайная задержка перед выполнением крупных слияний/мутаций, чтобы равномернее распределять нагрузку между репликами в случае репликации с нулевым копированием. #51282 (alesapin).
  • Запросы ALTER PARTITION и мутации не реплицируются через базу данных Replicated, если у неё только один сегмент, а базовая таблица — ReplicatedMergeTree. #51049 (Alexander Tokmakov).

Улучшение

  • Смягчены пороги для “Too many parts”, чтобы они лучше соответствовали современным реалиям. Восстановлено обратное давление при длительных запросах на вставку. #50856 (Alexey Milovidov).
  • Разрешено преобразование IPv6 в адрес IPv4 для CIDR ::ffff:0:0/96 (IPv4-отображённые адреса). #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).
  • В пакет Прогресс в протоколе TCP добавлен total_bytes_to_read для улучшения индикатора прогресса. #51158 (Kruglov Pavel).
  • Улучшена проверка частей данных на дисках при использовании файлового кэша. #51164 (Anton Popov).
  • Исправлено иногда возникавшее некорректное значение current_elements_num в fs cache. #51242 (Kseniia Sumarokova).

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

  • В автономный бинарный файл keeper добавлен встроенный keeper-client. #50964 (pufit).
  • Теперь используется актуальная версия LZ4. #50621 (Nikita Taranov).
  • ClickHouse server будет выводить список изменённых настроек при фатальных ошибках. Это закрывает #51137. #51138 (Alexey Milovidov).
  • Добавлена возможность собирать ClickHouse с clang-17. #51300 (Alexey Milovidov).
  • Проверка SQLancer теперь считается стабильной, поскольку все обнаруженные ею ошибки исправлены. Теперь сбои проверки SQLancer будут помечаться статусом failed check. #51340 (Ilya Yatsishin).
  • Огромная инструкция RUN в Dockerfile разбита на более мелкие условные части. Необходимые инструменты устанавливаются по мере необходимости в том же слое RUN, а затем удаляются. ОС обновляется только один раз в самом начале. Используется современный способ проверки подписанного репозитория. Базовый репозиторий понижен до ubuntu:20.04, чтобы устранить проблемы в старых версиях Docker. Версия golang обновлена для устранения уязвимостей в golang. #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).
  • Кэш запросов: исправлена попытка некорректного приведения из ColumnConst к ColumnVector<char8_t> #50704 (Robert Schulze).
  • Не сохранять в Keeper журналы с неизвестной операцией #50751 (Antonio Andelic).
  • Поддержка DateTime64 для SummingMergeTree #50797 (Jordi Villar).
  • Добавлена настройка совместимости для неконстантных часовых поясов #50834 (Robert Schulze).
  • Исправлено хеширование параметров LDAP в записях кэша #50865 (Julian Maicher).
  • В формате Parquet вместо исключения теперь используется резервный разбор большого целого числа из String #50873 (Kruglov Pavel).
  • Исправлена слишком частая проверка lock-файла во время записи резервной копии #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).
  • Исправлена малозаметная ошибка в механизме копирования при записи словаря 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. Презентация, Видео

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

  • Сжатие marks и первичного ключа теперь включено по умолчанию. Это значительно сокращает время выполнения холодных запросов. Примечания к обновлению: поддержка сжатых marks и первичного ключа была добавлена в версии 22.9. Если вы включили сжатие marks или первичного ключа либо установили версию 23.5 или новее, где сжатие marks и первичного ключа включено по умолчанию, вы не сможете откатиться до версии 22.8 или более ранней. Вы также можете явно отключить сжатие marks или первичного ключа, указав настройки compress_marks и compress_primary_key в разделе <merge_tree> файла конфигурации сервера. Примечания к обновлению: Если вы обновляетесь с версий до 22.9, следует либо обновить все реплики сразу, либо отключить сжатие перед обновлением, либо обновляться через промежуточную версию, в которой поддерживаются сжатые marks, но они не включены по умолчанию, например 23.3. #42587 (Alexey Milovidov).
  • Обеспечена согласованная работа локального объектного хранилища с объектным хранилищем S3, исправлена проблема с добавлением в конец (закрывает #48465), а также добавлена возможность настраивать его как независимое хранилище. Это изменение обратно несовместимо, поскольку кэш поверх локального объектного хранилища несовместим с предыдущими версиями. #48791 (Kseniia Sumarokova).
  • Экспериментальная возможность “in-memory data parts” удалена. Формат данных по-прежнему поддерживается, но настройки теперь не имеют эффекта, и вместо этого будут использоваться части в формате compact или wide. Это закрывает #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 Solodovnikov).
  • Географические типы данных (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 для всех таблиц, принадлежащих базе данных. #47640 (Ilya Golshtein).

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

  • Сжатие marks и первичного ключа включено по умолчанию. Это значительно сокращает время выполнения холодных запросов. Примечания по обновлению: поддержка сжатых marks и первичного ключа была добавлена в версии 22.9. Если вы включили сжатие marks или первичного ключа либо установили версию 23.5 или новее, в которой сжатие marks и первичного ключа включено по умолчанию, вы не сможете вернуться на версию 22.8 или более раннюю. Вы также можете явно отключить сжатие marks или первичных ключей, указав настройки compress_marks и compress_primary_key в разделе <merge_tree> в файле конфигурации сервера. #42587 (Alexey Milovidov).
  • Новая настройка s3_max_inflight_parts_for_one_file задает ограничение на число частей, одновременно загружаемых в рамках запроса multipart-загрузки для одного файла. #49961 (Sema Checherinda).
  • При чтении из нескольких файлов уменьшено число потоков параллельного парсинга для каждого файла. Устраняет проблему #42192. #46661 (SmitaRKulkarni).
  • Используйте агрегатную проекцию только в том случае, если при её чтении затрагивается меньше гранул, чем при обычном чтении. Это должно помочь, если запрос затрагивает PK таблицы, но не проекцию. Исправлено #49150. #49417 (Nikolai Kochetov).
  • Не хранить блоки в ANY hash join, если ничего не вставлено. #48633 (vdimir).
  • Исправлен агрегатный комбинатор -If при использовании JIT-компиляции, а также включена JIT-компиляция для агрегатных функций. Закрывает #48120. #49083 (Igor Nikonov).
  • Для чтения из удалённых таблиц мы используем задачи меньшего размера (вместо чтения всей части), чтобы работал механизм перераспределения задач * размер задачи определяется размером считываемых столбцов * для чтения из 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 раз, особенно при JOIN небольшой левой таблицы с большой правой таблицей. #49585 (lgbo).
  • Производительность BLAKE3 улучшена на 11% за счёт включения LTO для Rust. #49600 (Azat Khuzhin). Теперь он на уровне C++.
  • Оптимизирована структура system.opentelemetry_span_log. Где уместно, используется LowCardinality. Хотя эта таблица в целом довольно неудачна (в ней используется тип данных Map даже для распространённых атрибутов), она станет немного лучше. #49647 (Alexey Milovidov).
  • Предпринята попытка заранее зарезервировать размер хеш-таблицы в JOIN grace_hash. #49816 (lgbo).
  • Параллельное слияние состояний uniqExactIf. Закрывает #49885. #50285 (flynn).
  • Улучшение Keeper: в Keeper добавлен запрос CheckNotExists, который позволяет повысить производительность таблиц Replicated. #48897 (Antonio Andelic).
  • Улучшения производительности Keeper: исключена двойная сериализация одного и того же запроса во время обработки. Результаты десериализации крупных запросов теперь кэшируются. Управляется новой настройкой координации min_request_size_for_cache. #49004 (Antonio Andelic).
  • Снижено количество запросов List к ZooKeeper при выборе частей для слияния, если во многих партициях нечего сливать. #49637 (Alexander Tokmakov).
  • Переработан механизм блокировок в FS cache #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).
  • Увеличен параллелизм при удалении устаревших частей с «репликацией с нулевым копированием». #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) Если в запросе SELECT используется модификатор FINAL и включены параллельные реплики, 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).
  • Добавлена поддержка суффиксов единиц размера в параметрах оператора создания QUOTA. #49087 (Eridanus).
  • Функции first_value и last_value теперь принимают NULL. #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 (для совместимости с хранилищем S3 CloudFlare R2). #48492 (Azat Khuzhin).
  • Добавлены новые столбцы с информацией о репликах базы данных Replicated в system.clusters: database_shard_name, database_replica_name, is_active. В запрос SYSTEM DROP DATABASE REPLICA добавлено необязательное предложение FROM SHARD. #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).
  • В MongoDB добавлен тип данных Array. Закрывает #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).
  • При вызове через OUTFILE модуль записи Parquet теперь использует разумный размер групп строк. #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).
  • Разрешено чтение объектов нулевого размера из удалённых файловых систем. (поскольку для пустых файлов не создаются резервные копии, в файле метаданных в итоге может оказаться ноль blob-объектов). Закрывает #49480. #49519 (Kseniia Sumarokova).
  • MemoryTracker потока теперь присоединяется к total_memory_tracker после отсоединения ThreadGroup. #49527 (Dmitry Novik).
  • Исправлена работа параметризованных представлений при многократном использовании параметра запроса в одном запросе. #49556 (Azat Khuzhin).
  • Освободить память, выделенную для последнего отправленного снимка ProfileEvents в контексте запроса. Дополнение к #47564. #49561 (Dmitry Novik).
  • У функции “makeDate” теперь есть перегрузка, совместимая с MySQL (с аргументами year & номер дня в году). #49603 (Robert Schulze).
  • Добавлена поддержка табличной функции dictionary для RegExpTreeDictionary. #49666 (Han Fei).
  • Добавлена политика взвешенного справедливого планирования IO. Добавлен динамический менеджер ресурсов, который позволяет обновлять иерархию планирования IO во время работы без перезапуска сервера. #49671 (Sergei Trifonov).
  • Добавлен запрос compose после multipart-загрузки в GCS. Это позволяет использовать операцию копирования для объектов, загруженных через multipart-загрузку. Рекомендуется задать для s3_strict_upload_part_size какое-либо значение, поскольку запрос compose может завершиться ошибкой для объектов, созданных из частей разного размера. #49693 (Antonio Andelic).
  • Для функции extractKeyValuePairs: улучшена логика parsing в режиме “best-effort”, чтобы key_value_delimiter принимался как допустимая часть значения. Это также упрощает ветвление и, возможно, даже немного повышает производительность. #49760 (Arthur Passos).
  • В system.processors&#95;profile&#95;log добавлено поле initial_query_id #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 являются одноэлементными Tuple. #49844 (MikhailBurdukov).
  • Функция bitHammingDistance теперь поддерживает типы данных String и FixedString. Закрывает #48827. #49858 (flynn).
  • Исправлены ошибки, из-за которых в клиенте на OS X сбрасывался тайм-аут. #49863 (alekar).
  • Добавлена поддержка больших целых чисел, таких как UInt128, Int128, UInt256 и Int256, в функции bitCount. Это позволяет вычислять расстояние Хэмминга для больших битовых масок в приложениях ИИ. #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).
  • Для запросов с предложением ON CLUSTER теперь сохраняется initial_query_id, что полезно для интроспекции (при 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-групп. Compute-группа как кластер невидима для других compute-групп. #50186 (Yangkuan Liu).
  • Исправлено поведение, при котором PostgreSQL считывал все данные, даже если мог быть указан LIMIT n. #50187 (Kseniia Sumarokova).
  • Добавлены новые события профилирования для запросов, содержащих подзапросы (QueriesWithSubqueries/SelectQueriesWithSubqueries/InsertQueriesWithSubqueries). #50204 (Azat Khuzhin).
  • Добавлено поле roles в файл users.xml, что позволяет задавать роли с привилегиями через конфигурационный файл. #50278 (pufit).
  • В AsynchronousMetrics добавлены CGroupCpuCfsPeriod и CGroupCpuCfsQuota. - При запуске сервера теперь учитываются ограничения памяти cgroup v2. #50379 (alekar).
  • Добавлен обработчик сигнала SIGQUIT, работающий так же, как и для SIGINT. Закрывает #50298. #50435 (Nikolay Degterinsky).
  • Если JSON не удаётся разобрать из-за большого размера объекта, выводить последнюю позицию для упрощения отладки. #50474 (Valentin Alexeev).
  • Поддержка decimal-типов без фиксированного размера. Закрывает #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 (управление процессами) недоступен, например в 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&#95;tests&#95;&#95;release&#95;&#95;databasereplicated&#95;&#95;[3&#95;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).
  • Исправление состояния Sequence #48603 (Ilya Golshtein).
  • Проверка параллелизма Back/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 Solodovnikov).
  • Исправлена ошибка при удалении каталога существующей части #49365 (alesapin).
  • Исправлена работа GCS при использовании HMAC #49390 (Antonio Andelic).
  • Исправлена ошибка, выявленная фаззингом: при чтении из remote() не строилось множество для подзапроса #49425 (Alexander Gololobov).
  • Инвертирован параметр shutdown_wait_unfinished_queries #49427 (Konstantin Bogdanov).
  • (Экспериментальная zero-copy репликация) Исправлена ещё одна ошибка в zero-copy #49473 (alesapin).
  • Исправлена настройка базы данных PostgreSQL #49481 (Mal Curtis).
  • Корректная обработка аргументов s3Cluster #49490 (Antonio Andelic).
  • Исправлена ошибка в деструкторе TraceCollector. #49508 (Yakov Olkhovskiy).
  • Исправлена ошибка в AsynchronousReadIndirectBufferFromRemoteFS при коротких seek-операциях #49525 (Michael Kolupaev).
  • Исправлен порядок загрузки словарей #49560 (Alexander Tokmakov).
  • Запретить изменение типа данных у столбца Object(‘json’) #49563 (Nikolay Degterinsky).
  • Исправлен стресс-тест (логическая ошибка: ожидалось 7134 >= 11030) #49623 (Kseniia Sumarokova).
  • Исправлена ошибка в работе DISTINCT #49628 (Alexey Milovidov).
  • Исправление: DISTINCT in order при нулевых значениях в несортируемых столбцах #49636 (Igor Nikonov).
  • Исправлена ошибка на единицу в больших целых числах, обнаруженная UBSan с помощью фаззера #49645 (Alexey Milovidov).
  • Исправлена ошибка чтения из разреженных столбцов после перезапуска #49660 (Anton Popov).
  • Исправлен assert в SpanHolder::finish() при работе с fibers #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).
  • Исправлены настройки ограничения скорости ввода-вывода и резервного копирования для отдельных запросов #49797 (Azat Khuzhin).
  • Исправлено задание NULL в определении профиля #49831 (Vitaly Baranov).
  • Исправлена ошибка в проекциях и настройке aggregate_functions_null_for_empty (для query_plan_optimize_projection) #49873 (Amos Bird).
  • Исправлена обработка ожидающего батча в Distributed async INSERT после перезапуска #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).
  • Исправлена логическая ошибка в стресс-тесте “Недостаточно места для добавления …” #50021 (Kseniia Sumarokova).
  • Предотвращена взаимная блокировка при запуске таблицы в потоке attach для ReplicatedMergeTree #50026 (Antonio Andelic).
  • Исправлен assert в SpanHolder::finish() при работе с fibers, попытка 2 #50034 (Kruglov Pavel).
  • Добавлено корректное экранирование при сериализации DDL-контекста OpenTelemetry #50045 (Azat Khuzhin).
  • Исправлено отображение поврежденных частей проекций #50052 (Amos Bird).
  • Исправлено not equals NaN при JIT-компиляции #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).
  • Исправление в JIT-агрегации для Nullable-ключа #50291 (Maksim Kita).
  • Исправлен сбой clickhouse-local при записи пустого вывода в формате Arrow или Parquet #50328 (Michael Kolupaev).
  • Исправлено аварийное завершение при вызове Pool::Entry::disconnect() #50334 (Val Doroshchuk).
  • Улучшено получение части данных за счёт более длительного удержания блокировки каталога #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).
  • Исправлена логическая ошибка в стресс-тесте (Недостаточно места для добавления …) #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 ожидает только загрузки и диапазоны удаления (слияния и мутации игнорируются). Версия 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() теперь можно вызывать с аргументами pattern и replacement, не являющимися константами. #46589 (Robert Schulze).
  • Добавлены функции для работы со столбцами типа Map: mapConcat, mapSort, mapExists. #48071 (Anton Popov).

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

  • Чтение файлов в формате Parquet теперь стало значительно быстрее. Ввод-вывод и декодирование распараллелены (это управляется настройкой max_threads), при этом читаются только нужные диапазоны данных. #47964 (Michael Kolupaev).
  • Если запустить мутацию с IN (subquery) вот так: ALTER TABLE t UPDATE col='new value' WHERE id IN (SELECT id FROM huge_table), и таблица t состоит из нескольких частей, то для каждой части в памяти строится Set для подзапроса SELECT id FROM huge_table. Если частей много, это может потреблять много памяти (и приводить к OOM) и ресурсов CPU. Решение — добавить краткоживущий кэш Set, которые в данный момент строятся задачами мутации. Если другая задача той же мутации выполняется одновременно, она может найти Set в кэше, дождаться его построения и использовать повторно. #46835 (Alexander Gololobov).
  • Зависимости при применении запросов ALTER TABLE теперь проверяются только при необходимости. #48062 (Raúl Marín).
  • Оптимизирована функция mapUpdate. #48118 (Anton Popov).
  • Теперь внутренний запрос к локальной реплике отправляется явно, а данные от нее получаются через интерфейс loopback. Настройка prefer_localhost_replica не учитывается для параллельных реплик. Это нужно для более эффективного планирования и делает код чище: initiator отвечает только за координацию процесса чтения и слияние результатов, непрерывно отвечая на запросы, пока все вторичные запросы читают данные. Примечание: использование интерфейса loopback не так производительно, однако в противном случае некоторые реплики могли бы остаться без задач, что привело бы к еще более медленному выполнению запроса и неполному использованию доступных ресурсов. Инициализация coordinator теперь стала еще более отложенной. Все входящие запросы содержат информацию об алгоритме чтения, и coordinator инициализируется ею при поступлении первого запроса. Если какая-либо реплика решит читать с другим алгоритмом, будет сгенерировано исключение, и запрос будет прерван. #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, которая по умолчанию выключена.
  • Снижена конкуренция за mutex в ThreadPool (это может повысить производительность при очень большом количестве маленьких задач). #48750 (Sergei Trifonov).
  • Снижено использование памяти при нескольких мутациях ALTER DELETE. #48522 (Nikolai Kochetov).
  • Убраны избыточные попытки установить connection, если включена настройка skip_unavailable_shards. #48771 (Azat Khuzhin).

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

  • Элементы кэша запросов теперь объединяются до размера max_block_size и сжимаются. #45912 (Robert Schulze).
  • Теперь можно задавать пользовательские квоты в кэше запросов. #48284 (Robert Schulze).
  • Несколько исправлений для параллельных реплик #48433 (Nikita Mikhaylov).
  • Реализована zero-copy-репликация (экспериментальная возможность) для зашифрованных дисков. #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).
  • Добавлены асинхронное подключение к сокету и асинхронная запись в сокет. Создание соединений и отправка запроса/внешних таблиц между сегментами теперь выполняются асинхронно. Код отрефакторен с использованием фибр. Закрывает #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).
  • Для S3 по умолчанию включена опция use_environment_credentials, поэтому по умолчанию формируется вся цепочка провайдеров учётных данных. #47397 (Antonio Andelic).
  • В настоящее время функция JSON_VALUE похожа на функцию spark’s get_json_object: она позволяет получать значение из строки JSON по пути вида ‘$.key’. Но между ними есть некоторые отличия: - 1. в spark’s get_json_object возвращается null, если такой путь не существует, а в JSON_VALUE возвращается пустая строка; - 2. в spark’s get_json_object может возвращаться значение сложного типа, например объект JSON/массив, тогда как в JSON_VALUE возвращается пустая строка. #47494 (KevinyhZou).
  • Для use_structure_from_insertion_table_in_table_functions добавлено более гибкое наследование структуры таблицы вставки в table function. Исправлена проблема с сопоставлением имён и использованием виртуальных столбцов. Настройка ‘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).
  • Ограничение скорости на уровне запроса/сервера для удалённого/локального ввода-вывода и резервных копий (настройки сервера: 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).
  • Разрешена запись/чтение безымянного Tuple как вложенного Message в формате Protobuf. Элементы Tuple и поля Message сопоставляются по порядку. #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).
  • Генерация корректных значений Decimals и 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).
  • Правильно заданы заголовки для native-операций копирования в GCS. #48981 (Antonio Andelic).
  • Добавлена поддержка указания имён настроек в командной строке с дефисами вместо подчёркиваний, например --max-threads вместо --max_threads. Кроме того, добавлена поддержка символов тире Unicode, таких как вместо --, что полезно, если вы общаетесь с командой из другой компании и менеджер из этой команды скопировал код из MS Word. #48985 (alekseygolub).
  • Добавлена возможность переключения на аутентификацию по паролю, если аутентификация с использованием пользовательского SSL-сертификата завершилась неудачей. Закрывает #48974. #48989 (Nikolay Degterinsky).
  • Улучшена встроенная панель мониторинга. Исправляет #46671. #49036 (Kevin Zhang).
  • Добавлены profile events для сообщений лога, чтобы было проще видеть количество сообщений лога по уровням серьёзности. #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).
  • В тестах рандомизировано сжатие marks и индексов. #48286 (Alexey Milovidov).
  • Внутренний ZSTD обновлен с 1.5.4 до 1.5.5. #46797 (Robert Schulze).
  • В тестах рандомизированы Вертикальные слияния из compact в wide части. #48287 (Raúl Marín).
  • Добавлена поддержка контрольной суммы CRC32 в HDFS. Исправлены проблемы с производительностью. #48614 (Alexey Milovidov).
  • Удалены остатки поддержки GCC. #48671 (Robert Schulze).
  • Добавлен запуск CI с включенной новой инфраструктурой анализатора. #48719 (Dmitry Novik).

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

  • Исправлен system.query_views_log для MV, в которые данные записываются из фоновых потоков #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 поверх 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).
  • Исправлен возможный segfault в 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, из-за которой в ACL узел иногда не создавался со схемой auth. #48595 (Aleksei Filatov).
  • Разрешено использование операторов сравнения IPv4 с UInt #48611 (Yakov Olkhovskiy).
  • Исправлена возможная ошибка в кэше #48636 (Kseniia Sumarokova).
  • Асинхронные вставки с пустыми данными больше не будут приводить к исключению. #48663 (Anton Popov).
  • Исправлены зависимости таблиц в случае неудачного выполнения RENAME TABLE #48683 (Azat Khuzhin).
  • Если первичный ключ содержит повторяющиеся столбцы (что возможно только для проекций), то в предыдущих версиях это могло приводить к ошибке #48838 (Amos Bird).
  • Исправлено состояние гонки в ZooKeeper при ожидании завершения send_thread/receive_thread #48849 (Alexander Gololobov).
  • Исправлена ошибка unexpected part name при попытке удалить игнорируемую detached-часть при репликации с нулевым копированием #48862 (Michael Lex).
  • Исправлено чтение столбца Date32 из Parquet/Arrow в столбец не типа Date32 #48864 (Kruglov Pavel).
  • Исправлена ошибка UNKNOWN_IDENTIFIER при выборке из таблицы с политикой доступа к строкам и столбцом с точками #48976 (Kruglov Pavel).
  • Исправлена агрегация по пустым строкам типа Nullable #48999 (LiuNeng).

Релиз ClickHouse 23.3 LTS, 2023-03-30. Презентация, Видео

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

  • Легковесные DELETE готовы к промышленному использованию и включены по умолчанию. Запрос DELETE для таблиц MergeTree теперь доступен по умолчанию.
  • Поведение функций *domain*RFC и netloc немного изменено: набор символов, разрешённых в authority URL, расширен для лучшего соответствия стандартам. #46841 (Azat Khuzhin).
  • Запрещено создавать таблицы на основе KafkaEngine с операторами DEFAULT/EPHEMERAL/ALIAS/MATERIALIZED для столбцов. #47138 (Aleksandr Musorin).
  • Возможность «асинхронного освобождения соединений» удалена. Связанные настройки и метрики также удалены. Это была внутренняя возможность, поэтому её удаление не должно повлиять на пользователей, которые никогда о ней не слышали. #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 в качестве структуры по умолчанию для table function 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).
  • Добавлена функция mapFromArrays, связанная с Map и позволяющая создавать Map из пары массивов. #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). Добавлен отдельный пул потоков для операций ввода-вывода резервного копирования. Это позволит масштабировать его независимо от других пулов и повысить производительность. #47174 (Nikita Mikhaylov). Для сбора метаданных на заключительном этапе обработки резервной копии теперь используются запрос MultiRead и повторные попытки. #47243 (Nikita Mikhaylov). Если и резервная копия, и восстанавливаемые данные находятся в S3, то теперь следует использовать копирование на стороне сервера. #47546 (Vitaly Baranov).
  • Исправлено избыточное чтение в запросах с FINAL. #47801 (Nikita Taranov).
  • Значение max_final_threads будет устанавливаться равным количеству ядер при запуске сервера (по тому же алгоритму, что используется для max_threads). Это повышает параллелизм выполнения FINAL на серверах с большим числом CPU. #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 вместо DISTINCT для получения списка партиций теперь используется GROUP BY. Для больших таблиц это сократило время выполнения SELECT с более чем 500 с до менее 1 с. #47386 (Clayton McClure).
  • Исправлена деградация производительности в ASOF JOIN. #47544 (Ongkong).
  • Ещё больше батчинга в Keeper. Производительность улучшена за счёт того, что батчи не разбиваются при запросах на чтение. #47978 (Antonio Andelic).
  • Разрешено использовать PREWHERE для Merge с различными DEFAULT-выражениями у столбцов. #46831 (Azat Khuzhin).

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

  • Параллельные реплики: улучшена общая производительность за счет более эффективного использования локальной реплики, а также по умолчанию запрещено чтение с параллельными репликами из нереплицируемых таблиц MergeTree. #47858 (Nikita Mikhaylov).
  • Добавлена поддержка проталкивания фильтра в левую таблицу для JOIN с таблицами Join, Dictionary и EmbeddedRocksDB, если включен экспериментальный анализатор. #47280 (Maksim Kita).
  • Теперь у ReplicatedMergeTree с репликацией с нулевым копированием снижена нагрузка на 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: поддержка подключения к набору реплик через 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).
  • Это улучшение должно пройти для вас незаметно. Анализ проекций переработан на основе плана запроса. Добавлена настройка 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).
  • Улучшено сообщение об ошибке, возникающей, когда невозможно переместить part с одного тома/диска на другой. #47032 (alesapin).
  • Добавлена поддержка типа Bool в функции JSONType. Ранее для логических значений по ошибке возвращался тип Null. #47046 (Anton Popov).
  • Используйте параметр _request_body для настройки заранее определённых HTTP-запросов. #47086 (Constantine Peresypkin).
  • Автоматическое добавление отступа во встроенном редакторе 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).
  • Добавлена поддержка Decimals и Date32 в формате Avro. #47434 (Kruglov Pavel).
  • Не запускать сервер, если обнаружено прерванное преобразование из Ordinary в Atomic; выводить более понятное сообщение об ошибке с инструкциями по устранению неполадок. #47487 (Alexander Tokmakov).
  • В system.opentelemetry_span_log добавлен новый столбец kind. Этот столбец содержит значение 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). Примечание: эта запись в changelog переписана с помощью ChatGPT.
  • Параметр exact_rows_before_limit используется, чтобы rows_before_limit_at_least точно отражал количество строк, возвращённых до достижения лимита. Этот pull request устраняет проблемы, возникавшие, когда запрос включает распределённую обработку на нескольких сегментах или операции сортировки. До этого обновления эти сценарии работали не так, как ожидалось. #47874 (Amos Bird).
  • Интроспекция метрик ThreadPools. #47880 (Azat Khuzhin).
  • Добавлены события профиля WriteBufferFromS3Microseconds и WriteBufferFromS3RequestsErrors. #47885 (Antonio Andelic).
  • В установку ClickHouse добавлены параметры --link и --noninteractive (-y). Закрывает #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-фаззере. #47803 #47852 (flynn).
  • Разделены стресс-тест и автоматическая проверка обратной совместимости (теперь — Upgrade check). #44879 (Kruglov Pavel).
  • Образ Ubuntu для Docker обновлён, чтобы уменьшить количество ложных сообщений о проблемах безопасности. #46784 (Julio Jimenez). Обратите внимание: ClickHouse не имеет зависимостей и не требует Docker.
  • Добавлен промпт, позволяющий удалить существующую загрузку clickhouse при установке ClickHouse через “curl | sh”. Текст промпта: “Бинарный файл ClickHouse clickhouse уже существует. Перезаписать? [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 не приводит к аварийному завершению. Он покрывает изменения из 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, если во время DROP истекал сеанс ZooKeeper и параллельно создавалась новая реплицированная таблица с тем же путём в 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 вызывал аварийное завершение при обработке пустого блока в Filling Transform #46897 (Yakov Olkhovskiy).
  • Исправлено определение типов date и int по строкам в JSON #46972 (Kruglov Pavel).
  • Исправлена ошибка выбора диска при fetch в zero-copy-репликации #47010 (alesapin).
  • Исправлена опечатка в описании сервиса systemd #47051 (Palash Goel).
  • Исправлена ошибка NOT_IMPLEMENTED при использовании CROSS JOIN и algorithm = auto #47068 (Vladimir C).
  • Исправлена проблема, из-за которой в таблицу ‘ReplicatedMergeTree’ не удавалось вставить два похожих набора данных, когда ‘part_type’ настроен в режиме ‘InMemory’ (экспериментальная возможность). #47121 (liding1992).
  • Внешние словари / library-bridge: исправлена ошибка “неизвестный библиотечный метод ‘extDict_libClone’” #47136 (alex filatov).
  • Исправлено состояние гонки в grace hash JOIN при ограничении #47153 (Vladimir C).
  • Исправлена поддержка PREWHERE для отдельных столбцов #47154 (Azat Khuzhin).
  • Исправлена возможная взаимная блокировка в статусе запроса #47161 (Kruglov Pavel).
  • Запретили вставку через 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 с проекцией #47473 (flynn).
  • Исправлена работа параметров запроса #47488 (Alexey Milovidov).
  • Параметризованное представление: исправлена ошибка. #47495 (SmitaRKulkarni).
  • Фаззер форматов данных и связанные с ним исправления. #47519 (Alexey Milovidov).
  • Исправлена проверка монотонности для DateTime64 #47526 (Antonio Andelic).
  • Исправлено несоответствие структуры блока для столбца 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).
  • Исправлена ошибка в сериализации tuple как array в формате 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).
  • Исправление восстановления базы данных Replicated #47901 (Alexander Tokmakov).
  • Экстренное исправление слишком подробных предупреждений для HTTP #47903 (Alexander Tokmakov).
  • Исправлено “Слишком длинное значение поля” в catboostEvaluate #47970 (Robert Schulze).
  • Исправлено #36971: Watchdog: выход с ненулевым кодом, если дочерний процесс завершается #47973 (Коренберг Марк).
  • Исправление ошибки “файл индекса cidx имеет неожиданно большую длину” #48010 (SmitaRKulkarni).
  • Исправлен запрос MaterializedPostgreSQL для получения атрибутов (replica-identity) #48015 (Solomatov Sergei).
  • parseDateTime(): Исправлено UB (переполнение знакового целочисленного типа) #48019 (Robert Schulze).
  • Используйте уникальные имена для записей в Avro, чтобы не использовать одну и ту же схему повторно #48057 (Kruglov Pavel).
  • Корректно настроены тайм-ауты TCP/HTTP-сокетов в Keeper #48108 (Antonio Andelic).
  • Исправлен возможный вызов метода через нулевой указатель в формате Avro #48184 (Kruglov Pavel).

Релиз ClickHouse 23.2, 2023-02-23. Презентация, Видео

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

  • Функция “toDayOfWeek()” (alias: “DAYOFWEEK”) была расширена аргументом режима, который задает, начинается ли неделя с понедельника или с воскресенья, и начинается ли отсчет с 0 или с 1. Для согласованности с другими функциями дата-время аргумент режима был добавлен между аргументами времени и часового пояса. Это нарушает существующее использование (ранее не документированного) синтаксиса с 2 аргументами “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).
  • В system.replication&#95;queue добавлен новый столбец last_exception_time. #45457 (Frank Chen).
  • Добавлены две новые функции, позволяющие задавать пользовательские ключи и seed для SipHash. #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 … ). Она группирует условия, для которых требуется чтение одних и тех же столбцов, по шагам. После каждого шага вычисляется соответствующая часть полного условия, и результирующие строки могут быть отфильтрованы. Это позволяет считывать меньше строк на следующих шагах, тем самым экономя пропускную способность ввода-вывода и сокращая объем вычислений. Сейчас эта логика по умолчанию отключена. Она будет включена по умолчанию в одном из будущих релизов, когда станет ясно, что она не приводит к регрессиям, поэтому ее настоятельно рекомендуется использовать для тестирования. Ею можно управлять с помощью 2 настроек: “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 использовал только половину ядер (например, когда Hyper-Threading отключён в BIOS). #44973 (Robert Schulze).
  • Повышена производительность функции multiIf за счёт столбцового выполнения — ускорение в 2,3 раза. #45296 (李扬).
  • Добавлен ускоренный путь выполнения для функции position, когда needle пуст. #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).
  • Переписан код, связанный с распределением marks и общей координацией процесса чтения, для максимального повышения производительности. Это закрывает #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 (李扬).
  • Улучшено взаимодействие между слиянием с ограничением по памяти и агрегацией in order на верхнем уровне плана запроса. Ранее в некоторых случаях мы переходили к явной сортировке для 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 для именованных Tuple (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 format: добавлена поддержка типа duration. Закрывает #45669. #45750 (flynn).
  • Расширено журналирование в кэше запросов для упрощения анализа поведения кэширования. #45751 (Robert Schulze).
  • Параметры кэша запросов на уровне сервера теперь можно перенастраивать на лету. #45758 (Robert Schulze).
  • Скрытие пароля в журналах при указании аргументов табличной функции с помощью именованной коллекции. #45774 (Vitaly Baranov).
  • Улучшен внутренний клиент S3: теперь он корректно определяет Region и перенаправления для разных типов 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: используйте “точное” сопоставление в нечётком поиске — оно корректно игнорирует регистр и использует более подходящий алгоритм для сопоставления 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|16|32|64|128|256. Это слишком жёсткое ограничение для пользователей ClickHouse и к тому же не согласуется с другими похожими функциями, такими как arrayResize, substring и т. д. #46103 (李扬).
  • Исправлена проверка в функции welchTTest в отладочной сборке, когда итоговая статистика имеет значение NaN. Поведение приведено в соответствие с другими похожими функциями. Изменено поведение studentTTest: теперь функция возвращает NaN вместо того, чтобы генерировать исключение, поскольку прежнее поведение было неудобным. Это закрывает #41176. Это закрывает #42162. #46141 (Alexey Milovidov).
  • Более удобная работа с большими целыми числами и ORDER BY WITH FILL. Теперь в WITH FILL можно использовать обычные целые числа в качестве начальной и конечной точек при ORDER BY по большим (128-битным и 256-битным) целым числам. Исправлен неверный результат для больших целых чисел с отрицательными начальной или конечной точками. Это закрывает #16733. #46152 (Alexey Milovidov).
  • В system.tables добавлены столбцы parts, active_parts и total_marks в рамках задачи. #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. Форматирует значение Time в соответствии с заданной строкой формата. Формат — это константное выражение, поэтому для одного результирующего столбца нельзя использовать несколько форматов. (Укажите ссылку на formatDateTime). #46302 (Jake Bamrah).
  • Добавлены ProfileEvents и CurrentMetrics для callback-задач параллельных реплик (для таблиц 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: добавлена рандомизация настроек MergeTree в тестах. #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 как дочерний процесс вместо процесса PID 1 и перезапускать его после завершения. #46391 (Alexey Milovidov).
  • Исправлен файл сервиса systemd. #46461 (SuperDJY).
  • Минимальная версия Clang, необходимая для сборки ClickHouse, повышена с 12 до 15. #46710 (Robert Schulze).
  • Intel QPL обновлён с v0.3.0 до v1.0.0 2. Библиотека libaccel-config теперь собирается и статически линкуется с QPL вместо динамической линковки. #45809 (jasperzhu).

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

  • В StorageRabbitMQ данные теперь сбрасываются точно по rabbitmq_flush_interval_ms или rabbitmq_max_block_size. Закрывает #42389. Закрывает #45160. #44404 (Kseniia Sumarokova).
  • Использовать PODArray при отрисовке в функции sparkBar, чтобы контролировать использование памяти. Закрывает #44467. #44489 (Duc Canh Le).
  • Исправлена ошибка, из-за которой функции (quantilesExactExclusive, quantilesExactInclusive) возвращали элемент массива не в отсортированном порядке. #45379 (wujunfu).
  • Исправлено необработанное исключение в HTTPHandler при включенной телеметрии OpenTelemetry. #45456 (Frank Chen).
  • Не распознавать даты в 8-значных числах. Это могло приводить к неверному чтению данных. #45581 (Kruglov Pavel).
  • Исправлено корректное использование настройки odbc_bridge_use_connection_pooling. #45591 (Bharat Nallan).
  • Когда вызывается callback в кэше, этот кэш может быть уже уничтожен. Чтобы избежать этого, мы захватываем члены по значению. Это также безопасно для планировщика задач, поскольку он деактивируется до уничтожения хранилища. Исправляет #45548. #45601 (Han Fei).
  • Исправлено повреждение данных при использовании кодеков Delta или DoubleDelta вместе с кодеком Gorilla. #45615 (Robert Schulze).
  • Исправлена проверка типов при использовании индекса N-граммного bloom-фильтра, чтобы избежать некорректных чтений. #45617 (Antonio Andelic).
  • Сообщалось о паре сегфолтов, связанных с c-ares. Они появились в моих предыдущих пул-реквестах. Я исправил их с помощью Александра Токмакова. #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; возвращают неверные результаты (для этого SQL-запроса результат пустой). Это вызвано лишним шагом OFFSET, добавленным планировщиком. #45822 (刘陶峰).
  • Обратная совместимость — разрешено неявное сужающее преобразование из UInt64 в IPv4, необходимое для выражения “INSERT … VALUES …”. #45865 (Yakov Olkhovskiy).
  • Исправлен IPv6-парсер для смешанного IPv4-адреса с пропущенным первым октетом (например, ::.1.2.3). #45871 (Yakov Olkhovskiy).
  • В таблицу system.processes и запрос SHOW PROCESSLIST добавлен столбец query_kind. Удалён дублирующийся код. Исправлена ошибка: глобальный параметр конфигурации 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 (десятикратная ошибка). #46047 (Azat Khuzhin).
  • Дополнительное исправление для замены доменных IP-типов (IPv4, IPv6) на встроенные: https://github.com/ClickHouse/ClickHouse/pull/43221. #46087 (Yakov Olkhovskiy).
  • Исправлена подстановка переменных окружения в конфигурации, если у параметра уже есть значение. Это исправление закрывает #46131. Это исправление закрывает #9547. #46144 (pufit).
  • Исправлено некорректное проталкивание предиката при использовании 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 при параллельном distributed 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 — в разделе настроек merge tree в конфигурации. 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, так как оно используется при последующих запусках analyze; исправлено #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). Это не имело смысла и приводило к несогласованностям.
  • Параллельные quorum-вставки могут работать некорректно с таблицами семейства *MergeTree, созданными с использованием устаревшего синтаксиса. Поэтому поддержка параллельных quorum-вставок для таких таблиц полностью отключена. Это не затрагивает таблицы, созданные с использованием нового синтаксиса. #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, а также добавлена поддержка всех форматов; кроме того, немного переработаны сами форматы: - Исправлена отправка сообщений в построчных форматах с суффиксами/префиксами. Теперь каждое сообщение форматируется полностью, со всеми разделителями, и может быть затем разобрано с помощью входного формата. - Добавлена поддержка блочных форматов, таких как 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 (теперь там обратные вызовы не используются), разрешено использовать 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 CPU). #43669 (Zhiguo Zhou).
  • По возможности избегайте установки блокировок чтения на таблицу system.tables. #43840 (Raúl Marín).
  • Оптимизирован ThreadPool. Эксперименты по производительности с бенчмарком SSB (Star Schema Benchmark) на устройстве ICX (Intel Xeon Platinum 8380 CPU, 80 ядер, 160 потоков) показывают, что это изменение позволяет снизить конкуренцию за mutex 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).
  • Добавлен кэш для async block id. Это позволит сократить количество запросов к ZooKeeper при включении дедупликации async inserts. #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 (для резервных копий без дедупликации вместо полного RESTORE можно использовать ATTACH). Например, 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).
  • Разрешена подстановка макросов в конечных точках дисков. Исправлено #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 как логический тип 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).
  • Оптимизированы и исправлены метрики для асинхронной вставки в Distributed. #44922 (Azat Khuzhin).
  • Добавлены настройки, запрещающие одновременное создание резервных копий и восстановление, что решает проблему #43891 Реализация: * Добавлены настройки уровня сервера, запрещающие одновременное создание резервных копий и восстановление; они считываются и устанавливаются при создании BackupWorker в Context. * По умолчанию эти настройки имеют значение true. * Перед запуском резервного копирования или восстановления добавлена проверка, не выполняются ли уже другие операции резервного копирования/восстановления. Для внутренних запросов проверяется, поступает ли запрос с текущего узла, с помощью backup_uuid. #45072 (SmitaRKulkarni).
  • Добавлен параметр конфигурации <storage_policy> для системных логов. #45320 (Stig Bakken).

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

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

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

  • Доменные IP-типы (IPv4, IPv6) заменены на native. #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).
  • Исправлена ошибка с неразбираемым значением по умолчанию для эфемерного столбца в метаданных таблицы. #44026 (Yakov Olkhovskiy).
  • Исправлен разбор некорректного значения версии в настройке совместимости. #44224 (Kruglov Pavel).
  • Вычитание interval из 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 “левая пяти-восьмая часть блока”) для отображения полос 5/8 и 6/8. Это изменение исправляет такое поведение: теперь для отображения полосы 6/8 используется символ ’▊’ (U+258A “левая три четверти блока”). #44410 (Alexander Gololobov).
  • Размещение настроек профиля после ограничений для настроек профиля в файле конфигурации приводило к тому, что эти ограничения не применялись. #44411 (Konstantin 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 для загрузок (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 из remote fs. Исправляет #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, возникавшая, когда wide-часть имела маску легковесного удаления. #44959 (Mingliang Pan).
  • Дополнительное исправление для замены доменных IP-типов (IPv4, IPv6) на нативные #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 для столбца в StoreageJoin, закрыто #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]; закрывает #45275. Исправлена ошибка, из-за которой тип bytes ошибочно определялся как Float. #45276 (flynn).
  • Генерировать корректное исключение, если явный PREWHERE нельзя использовать с таблицей на движке хранения Merge. #45319 (Antonio Andelic).
  • В WSL1 Ubuntu самораспаковывающийся ClickHouse не удаётся распаковать из-за несоответствия: /proc/self/maps сообщает inode 32-битного файла, тогда как stat сообщает 64-битный inode. #45339 (Yakov Olkhovskiy).
  • Исправлена гонка при запуске distributed таблицы, которая могла приводить к многократной обработке файла async 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) для геттера политики cache. Закрывает #45514. #45524 (Kseniia Sumarokova).
  • Использование array JOIN в мутациях запрещено, закрывает #42637 #44447 (SmitaRKulkarni).
  • Исправлена работа квалифицированных звёздочек с именем таблицы-алиаса и преобразователем столбцов. Устраняет #44736. #44755 (SmitaRKulkarni).
Последнее изменение 10 июня 2026 г.