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

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

Оглавление

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

Релиз ClickHouse 23.12, 2023-12-28

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

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

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

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

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

  • Во время обработки FINAL извлекаются диапазоны частей таблицы MergeTree, которые не пересекаются между собой. Таким образом можно избежать дополнительной логики 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 для встроенных типов данных. #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).
  • Вставки в распределённые таблицы теперь корректно обрабатывают обновления конфигурации кластера. Когда список узлов кластера динамически изменяется, Directory Monitor распределённой таблицы обновляет его. #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).
  • Исправлено возможное зависание распределённых отправок из-за ошибки «No such file or directory» (при восстановлении пакета с диска). Исправлены возможные проблемы с error_count из system.distribution_queue (если distributed_directory_monitor_max_sleep_time_ms > 5 мин). Добавлено профилирующее событие для отслеживания ошибок асинхронных INSERT — DistributedAsyncInsertionFailures. #57480 (Azat Khuzhin).
  • Добавлена поддержка сгенерированных столбцов PostgreSQL и значений по умолчанию для столбцов в MaterializedPostgreSQL (экспериментальная функция). Закрывает #40449. #57568 (Kseniia Sumarokova).
  • Позволяет применять изменения некоторых параметров конфигурации кэша файловой системы без перезапуска сервера. #57578 (Kseniia Sumarokova).
  • Корректная обработка структуры таблицы PostgreSQL при наличии пустого массива. #57618 (Mike Kot).
  • Публикует общее число ошибок, произошедших с момента последнего перезапуска сервера, в виде метрики ClickHouseErrorMetric_ALL. #57627 (Nikita Mikhaylov).
  • Разрешены узлы в конфигурационном файле со ссылкой from_env/from_zk и непустым элементом с replace=1. #57628 (Azat Khuzhin).
  • Табличная функция fuzzJSON, которая позволяет генерировать множество некорректных JSON-документов для фаззинга. #57646 (Julia Kartseva).
  • Разрешить преобразование IPv6 в UInt128 и выполнение двоичной арифметики. #57707 (Yakov Olkhovskiy).
  • Добавлена настройка async inserts deduplication cache, определяющая время ожидания обновления кэша. Настройка async_block_ids_cache_min_update_interval_ms объявлена устаревшей. Теперь кэш обновляется только в случае конфликтов. #57743 (alesapin).
  • Функцию sleep() теперь можно отменить с помощью KILL QUERY. #57746 (Vitaly Baranov).
  • Запретить запросы CREATE TABLE ... AS SELECT для движков таблиц Replicated в экспериментальной базе данных Replicated, поскольку они не поддерживаются. См. #35408. #57796 (Nikolay Degterinsky).
  • Исправлено и улучшено преобразование запросов к внешним базам данных для рекурсивного получения всех совместимых предикатов. #57888 (flynn).
  • Добавлена поддержка динамического изменения размера кэша файловой системы. Закрывает #57866. #57897 (Kseniia Sumarokova).
  • Корректно обрабатывать system.stack_trace для потоков с заблокированным SIGRTMIN (такие потоки могут встречаться в низкокачественных внешних библиотеках, таких как Apache rdkafka). #57907 (Azat Khuzhin). А также отправлять сигнал потокам только если он для них не заблокирован, чтобы избегать ожидания storage_system_stack_trace_pipe_read_timeout_ms, когда в этом нет никакого смысла. #58136 (Azat Khuzhin).
  • Корректно обрабатывать сбои Keeper при проверке вставок с кворумом. #57986 (Raúl Marín).
  • Добавлен максимум (пиковое значение) RSS (MemoryResidentMax) в system.asynchronous_metrics. #58095 (Azat Khuzhin).
  • Этот PR позволяет пользователям использовать ссылки в стиле S3 (https:// и s3://) без указания региона, даже если он отличается от региона по умолчанию. Также определяется корректный регион, если пользователь указал неверный. #58148 (Yarik Briukhovetskyi).
  • clickhouse-format --obfuscate будет распознавать Settings, MergeTreeSettings и часовые пояса и оставлять их имена без изменений. #58179 (Alexey Milovidov).
  • Добавлена явная функция finalize() в ZipArchiveWriter. Упрощён излишне сложный код в ZipArchiveWriter. Исправляет #58074. #58202 (Vitaly Baranov).
  • Кэши с одинаковым путём теперь используют одни и те же объекты кэша. Такое поведение было и раньше, но было нарушено в версии 23.4. Если такие кэши с одинаковым путём имеют разный набор настроек кэша, будет сгенерировано исключение о том, что это не допускается. #58264 (Kseniia Sumarokova).
  • Параллельные реплики (экспериментальная функция): более удобные параметры #57542 (Igor Nikonov).
  • Параллельные реплики (экспериментальная функция): улучшена обработка ответов на объявления #57749 (Igor Nikonov).
  • Параллельные реплики (экспериментальная функция): улучшен учет min_number_of_marks в ParallelReplicasReadingCoordinator #57763 (Nikita Taranov).
  • Параллельные реплики (экспериментальная функция): отключить параллельные реплики для IN (подзапроса) #58133 (Igor Nikonov).
  • Параллельные реплики (экспериментальная возможность): добавлено событие профилирования 'ParallelReplicasUsedCount' #58173 (Igor Nikonov).
  • Непостовые запросы, такие как HEAD, будут выполняться только на чтение, аналогично GET. #58060 (San).
  • Добавлен столбец bytes_uncompressed в system.part_log #58167 (Jordi Villar).
  • Добавлено имя базового бэкапа в таблицы system.backups и system.backup_log #58178 (Pradeep Chhetri).
  • Добавлена поддержка указания параметров запроса в утилите clickhouse-local через командную строку #58210 (Pradeep Chhetri).

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

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

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

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

Релиз ClickHouse 23.11, 2023-12-06

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

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

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

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

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

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

Улучшение

  • Добавлена новая настройка MergeTree add_implicit_sign_column_constraint_for_collapsing_engine (по умолчанию отключена). При включении добавляется неявное ограничение CHECK для таблиц CollapsingMergeTree, которое ограничивает значение столбца Sign значениями -1 и 1. #56701. #56986 (Kevin Mingtarja).
  • Добавлена возможность добавлять новые диски в конфигурацию хранилища без перезапуска. #56367 (Duc Canh Le).
  • Добавлена поддержка создания и материализации индекса в одном запросе ALTER, а также выполнения операций «modify TTL» и «materialize TTL» в одном запросе. Закрывает #55651. #56331 (flynn).
  • Добавлена новая табличная функция fuzzJSON, формирующая строки с искажёнными версиями исходной JSON-строки со случайными вариациями. #56490 (Julia Kartseva).
  • Движок Merge фильтрует записи в соответствии с политиками строк базовых таблиц, так что создавать для таблицы Merge отдельную политику строк не требуется. #50209 (Ilya Golshtein).
  • Добавлена настройка max_execution_time_leaf для ограничения времени выполнения на шарде при выполнении распределённого запроса и timeout_overflow_mode_leaf для управления поведением в случае истечения времени ожидания. #51823 (Duc Canh Le).
  • Добавлена настройка ClickHouse, позволяющая отключить туннелирование HTTPS‑запросов через HTTP‑прокси. #55033 (Arthur Passos).
  • Установите background_fetches_pool_size в 16 и background&#95;schedule&#95;pool&#95;size в 512 — такие значения лучше подходят для эксплуатации в production-среде при частых небольших вставках. #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-адреса в списке хостов DDL-записи. #54909 (Duc Canh Le).
  • Исправлен учет памяти, выделенной до привязки потока к запросу или пользователю. #56089 (Nikita Taranov).
  • Добавлена поддержка типа LARGE_LIST в форматах Apache Arrow. #56118 (edef).
  • Добавлена возможность ручной компакции EmbeddedRocksDB с помощью запроса OPTIMIZE. #56225 (Azat Khuzhin).
  • Добавлена возможность задавать BlockBasedTableOptions для таблиц EmbeddedRocksDB. #56264 (Azat Khuzhin).
  • SHOW COLUMNS теперь отображает эквивалентное имени типа данных MySQL, когда соединение установлено через протокол MySQL. Ранее это происходило только при установке use_mysql_types_in_show_columns = 1. При этом настройка сохранена, но помечена как устаревшая. #56277 (Robert Schulze).
  • Исправлена возможная ошибка The local set of parts of table doesn't look like the set of parts in ZooKeeper, возникавшая при перезапуске сервера сразу после выполнения операций TRUNCATE или DROP PARTITION. #56282 (Alexander Tokmakov).
  • Исправлена обработка неконстантных строк запроса в функциях formatQuery/formatQuerySingleLine. Также добавлены варианты обеих функций с OrNull, которые возвращают NULL, если запрос не удаётся разобрать, вместо генерации исключения. #56327 (Robert Schulze).
  • Разрешить создавать бэкап материализованного представления с удалённой внутренней таблицей вместо ошибки при создании бэкапа. #56387 (Kseniia Sumarokova).
  • Запросы к system.replicas инициируют обращения к ZooKeeper при выборке некоторых столбцов. Когда таблиц тысячи, эти обращения могут создавать значительную нагрузку на ZooKeeper. Если выполняется несколько одновременных запросов к system.replicas, они многократно выполняют одни и те же обращения. Изменение позволяет «устранять дублирование» обращений от конкурентных запросов. #56420 (Alexander Gololobov).
  • Исправлена трансляция в MySQL-совместимый запрос при выполнении запросов к внешним базам данных. #56456 (flynn).
  • Добавлена поддержка резервного копирования и восстановления таблиц с использованием движка KeeperMap. #56460 (Antonio Andelic).
  • Ответ с кодом 404 для CompleteMultipartUpload необходимо повторно проверять. Операция могла успешно выполниться на сервере, даже если клиент получил таймаут или другие сетевые ошибки. При следующей попытке CompleteMultipartUpload возвращается ответ 404. Если ключ объекта существует, операция считается успешной. #56475 (Sema Checherinda).
  • Включить HTTP-метод OPTIONS по умолчанию, что упрощает выполнение запросов к ClickHouse из веб-браузера. #56483 (Alexey Milovidov).
  • Значение параметра dns_max_consecutive_failures было по ошибке изменено в #46550; это изменение отменено, а значение скорректировано на более подходящее. Также увеличен таймаут HTTP keep-alive до разумного значения из боевого окружения. #56485 (Alexey Milovidov).
  • Ленивая загрузка базовых резервных копий (базовая резервная копия загружается только при необходимости). Также добавлены некоторые сообщения в лог и события профилирования для резервных копий. #56516 (Vitaly Baranov).
  • Настройка query_cache_store_results_of_queries_with_nondeterministic_functions (со значениями false или true) признана устаревшей. Она заменена настройкой query_cache_nondeterministic_function_handling — это перечислимый тип с тремя значениями, который определяет, как кэш запросов обрабатывает запросы с недетерминированными функциями: a) выбрасывать исключение (поведение по умолчанию), b) сохранять результат недетерминированного запроса в любом случае или c) игнорировать, то есть не выбрасывать исключение и не кэшировать результат. #56519 (Robert Schulze).
  • Переписывать сравнение с проверкой на is null в секции JOIN ON. Экспериментально, только Analyzer. #56538 (vdimir).
  • Функция concat теперь поддерживает аргументы произвольных типов (а не только аргументы типов String и FixedString). Это делает её поведение более похожим на реализацию concat в MySQL. Например, SELECT concat('ab', 42) теперь возвращает ab42. #56540 (Serge Klochkov).
  • Добавлена возможность получать конфигурацию кэша из секции 'named_collection' в конфигурации или из созданных через SQL именованных коллекций. #56541 (Kseniia Sumarokova).
  • Движок базы данных PostgreSQL: удаление устаревших таблиц стало менее агрессивным при неудачном подключении к Postgres. #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. Теперь сжатый блок буферизуется в редких случаях, когда ёмкости выходного буфера недостаточно для его прямой записи в буфер вывода. #56938 (Sema Checherinda).
  • Добавлены метрики количества задач в очереди, что полезно для пула потоков ввода-вывода. #56958 (Alexey Milovidov).
  • Добавлена настройка для движка таблиц PostgreSQL в конфигурационный файл. Добавлена проверка этой настройки. Добавлена документация по дополнительной настройке. #56959 (Peignon Melvyn).
  • Функцию concat теперь можно вызывать с одним аргументом, например, SELECT concat('abc'). Это делает её поведение более согласованным с реализацией функции concat в MySQL. #57000 (Serge Klochkov).
  • Подписывает все заголовки x-amz-* в соответствии с требованиями документации AWS S3. #57001 (Arthur Passos).
  • Функция fromDaysSinceYearZero (псевдоним: FROM_DAYS) теперь может использоваться с целочисленными типами со знаком и без знака (ранее требовалось, чтобы значение было целым числом без знака). Это улучшает совместимость со сторонними инструментами, такими как Tableau Online. #57002 (Serge Klochkov).
  • Добавить system.s3queue_log в конфигурацию по умолчанию. #57036 (Kseniia Sumarokova).
  • Изменено значение по умолчанию параметра wait_dictionaries_load_at_startup на true; используйте его только если dictionaries_lazy_load имеет значение false. #57133 (Vitaly Baranov).
  • Проверять тип источника словаря при создании, даже если включен dictionaries_lazy_load. #57134 (Vitaly Baranov).
  • Оптимизации на уровне плана теперь можно включать и отключать по отдельности. Ранее можно было только отключить их все целиком. Настройка, которая ранее выполняла эту функцию (query_plan_enable_optimizations), сохранена и по-прежнему может использоваться для отключения всех оптимизаций. #57152 (Robert Schulze).
  • Код завершения сервера будет соответствовать коду исключения. Например, если сервер не может запуститься из-за ограничения по памяти, он завершит работу с кодом 241 = MEMORY_LIMIT_EXCEEDED. В предыдущих версиях код завершения для исключений всегда был 70 = Poco::Util::ExitCode::EXIT_SOFTWARE. #57153 (Alexey Milovidov).
  • Не выполнять деманглирование и символизацию кадров стека из заголовочного файла C++ functional. #57201 (Mike Kot).
  • Страница HTTP-сервера /dashboard теперь поддерживает графики с несколькими линиями данных. #57236 (Sergei Trifonov).
  • Опция командной строки max_memory_usage_in_client поддерживает строковое значение с суффиксом (K, M, G и т. д.). Закрывает #56879. #57273 (Yarik Briukhovetskyi).
  • Обновлена Intel QPL (используется кодеком DEFLATE_QPL) с v1.2.0 до v1.3.1. Также исправлена ошибка при BOF (Block On Fault) = 0: изменено поведение обработки отказов страниц — теперь выполняется переход на программный путь (SW path). #57291 (jasperzhu).
  • Увеличено значение по умолчанию параметра MergeTree replicated_deduplication_window со 100 до 1k. #57335 (sichenzhao).
  • Старайтесь реже использовать INCONSISTENT_METADATA_FOR_BACKUP. По возможности продолжайте сканирование вместо того, чтобы останавливать его и запускать сканирование для резервного копирования заново с самого начала. #57385 (Vitaly Baranov).

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

  • Добавлен тест SQLLogic. #56078 (Han Fei).
  • Добавлены короткие имена (ch, chl, chc) для удобного использования clickhouse-local и clickhouse-client. #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).
  • Использовать отладочные символы DWARF 5 для исполняемого файла clickhouse (ранее использовался 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).
  • Включена temporary_data_in_cache в S3-тестах в CI. #48425 (vdimir).
  • Установлен максимальный объём памяти для clickhouse-client (1G) в CI. #56873 (Nikita Mikhaylov).

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

  • Исправлен экспериментальный Analyzer — оператор INSERT ... SELECT с подзапросом, ссылающимся на таблицу, в которую выполняется вставка, должен обрабатывать только вставляемый блок данных. #50857 (Yakov Olkhovskiy).
  • Исправлена ошибка в функции str_to_map. #56423 (Arthur Passos).
  • Keeper reconfig: добавить тайм-аут перед отказом от/получением лидерства #53481 (Mike Kot).
  • Исправлен некорректный заголовок в операциях grace hash join и filter pushdown #53922 (vdimir).
  • Разрешён выбор из системных таблиц, если таблица создана на основе табличной функции. #55540 (MikhailBurdukov).
  • RFC: исправление ошибки «Cannot find column X in source stream» для распределённых запросов с LIMIT BY #55836 (Azat Khuzhin).
  • Исправлена ошибка 'Cannot read from file:' при запуске клиента в фоновом режиме #55976 (Kruglov Pavel).
  • Исправлено аварийное завершение работы clickhouse-local при некорректной настройке send_logs_level #55994 (Kruglov Pavel).
  • Исправлена ошибка EXPLAIN AST с параметризованным представлением #56004 (SmitaRKulkarni).
  • Исправлена ошибка, приводившая к аварийному завершению работы при загрузке таблиц во время запуска #56232 (Nikolay Degterinsky).
  • Исправлены словари с источником ClickHouse с использованием явного запроса #56236 (Nikolay Degterinsky).
  • Исправлена ошибка сегментации (segfault) в обработчике сигналов Keeper #56266 (Antonio Andelic).
  • Исправлена проблема неполного результата запроса с UNION в функции view(). #56274 (Nikolai Kochetov).
  • Устранено несоответствие между "cast('0' as DateTime64(3))" и "cast('0' as Nullable(DateTime64(3)))" #56286 (李扬).
  • Исправлено редкое состояние гонки, связанное с ошибкой выделения памяти #56303 (alesapin).
  • Исправлено восстановление из резервной копии при использовании flatten_nested и data_type_default_nullable #56306 (Kseniia Sumarokova).
  • Исправлена ошибка, приводившая к сбою при добавлении столбца с типом Object(JSON) #56307 (Nikita Mikhaylov).
  • Исправлен сбой в filterPushDown #56380 (vdimir).
  • Исправлено восстановление из бэкапа с материализованным представлением и удалённой исходной таблицей #56383 (Kseniia Sumarokova).
  • Исправлена ошибка сегментации во время инициализации Kerberos #56401 (Nikolay Degterinsky).
  • Исправлено переполнение буфера в T64 #56434 (Alexey Milovidov).
  • Исправлен первичный ключ типа Nullable в final (2) #56452 (Amos Bird).
  • Исправлена работа запросов ON CLUSTER без указанной базы данных на исходном узле #56484 (Nikolay Degterinsky).
  • Исправлен сбой запуска из-за зависимости от TTL #56489 (Nikolay Degterinsky).
  • Исправлены запросы ALTER COMMENT с ON CLUSTER #56491 (Nikolay Degterinsky).
  • Исправлена операция ALTER COLUMN с ALIAS #56493 (Nikolay Degterinsky).
  • Исправлена обработка пустых NAMED COLLECTIONs #56494 (Nikolay Degterinsky).
  • Исправлены две проблемы в анализе проекций. #56502 (Amos Bird).
  • Исправлена обработка псевдонимов в кэше запросов #56545 (Robert Schulze).
  • Исправлена ошибка преобразования из Nullable(Enum) в Nullable(String) #56644 (Nikolay Degterinsky).
  • Более надёжная обработка логов в Keeper #56670 (Antonio Andelic).
  • Исправлено объединение конфигурации для узлов, использующих атрибуты подстановки #56694 (Konstantin Bogdanov).
  • Исправлено повторное использование табличной функции input(). #56695 (Nikolai Kochetov).
  • Исправлена проблема с динамической загрузкой OpenSSL в RabbitMQ #56703 (Igor Nikonov).
  • Исправлен сбой в кодеке GCD при наличии нулей в данных #56704 (Nikita Mikhaylov).
  • Исправлена ошибка 'mutex lock failed: Invalid argument' в clickhouse-local при выполнении insert into function #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 при partial merge join с joined_subquery_re... #57048 (vdimir).
  • Исправлена гонка состояний в RemoteSource #57052 (Raúl Marín).
  • Реализована функция bitHammingDistance для больших целых чисел #57073 (Alexey Milovidov).
  • Исправлена ошибка с ссылками формата S3 #57075 (Yarik Briukhovetskyi).
  • Исправлена функция JSON_QUERY с несколькими числовыми путями #57096 (KevinyhZou).
  • Исправлено переполнение буфера в кодеке Gorilla #57107 (Nikolay Degterinsky).
  • Закрывать межсерверное соединение при возникновении любого исключения до аутентификации #57142 (Antonio Andelic).
  • Исправлен segfault при выполнении ALTER UPDATE со столбцом Nullable MATERIALIZED #57147 (Nikolay Degterinsky).
  • Исправлена ошибка в оптимизации плана JOIN при частично материализованной обычной проекции #57196 (Amos Bird).
  • Игнорировать комментарии при сравнении описаний столбцов #57259 (Antonio Andelic).
  • Исправлена метрика ReadonlyReplica во всех случаях #57267 (Antonio Andelic).
  • Фоновые слияния теперь корректно используют временное хранилище данных в кэше #57275 (vdimir).
  • Исправление в Keeper для журнала изменений и снимков #57299 (Antonio Andelic).
  • Игнорировать завершённые задачи ON CLUSTER, если изменилось имя хоста #57339 (Alexander Tokmakov).
  • Мутации MergeTree повторно используют зернистость индекса исходной части #57352 (Maksim Kita).
  • FS cache: добавлено ограничение на фоновую загрузку #57424 (Kseniia Sumarokova).

Релиз ClickHouse 23.10, 2023-11-02

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

  • Больше нет возможности автоматически удалять повреждённые куски данных. Это закрывает #55174. #55184 (Alexey Milovidov). #55557 (Jihyuk Bok).
  • Устаревшие куски данных в памяти больше не могут читаться из журнала предзаписи (write-ahead log). Если вы ранее настраивали части данных в памяти (in-memory parts), их необходимо удалить перед обновлением. #55186 (Alexey Milovidov).
  • Удалена интеграция с Meilisearch. Причина: она была совместима только со старой версией 0.18. В новой версии Meilisearch протокол был изменён и больше не совместим. Примечание: мы будем признательны, если вы поможете вернуть её обратно. #55189 (Alexey Milovidov).
  • Переименована концепция directory monitor в background INSERT. Все настройки *directory_monitor* были переименованы в distributed_background_insert*. Обратная совместимость должна быть сохранена (так как старые настройки были добавлены как псевдонимы). #55978 (Azat Khuzhin).
  • send_timeout, установленный на стороне клиента, больше не интерпретируется как receive_timeout на стороне сервера и наоборот. #56035 (Azat Khuzhin).
  • Сравнение временных интервалов с разными единицами измерения теперь будет приводить к выбросу исключения. Это закрывает #55942. Возможно, вы иногда полагались на предыдущее поведение, когда сравнивались базовые числовые значения независимо от единиц измерения. #56090 (Alexey Milovidov).
  • Экспериментальный движок таблиц S3Queue был полностью переработан: изменён способ хранения информации в ZooKeeper, что позволяет выполнять меньше запросов в ZooKeeper, добавлено кэширование состояния ZooKeeper в случаях, когда известно, что состояние не изменится, улучшен процесс опроса S3, чтобы сделать его менее агрессивным, изменён способ сопровождения TTL и максимального набора для отслеживаемых файлов — теперь это фоновый процесс. Добавлены таблицы 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).
  • Если таблица имеет в своём ключе кривую, заполняющую пространство (space-filling curve), например 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. Реализация первой фазы уже объединена. #42510 (larryluogit).
  • Добавлена новая функция SQL arrayRandomSample(arr, k), которая возвращает выборку k элементов из входного массива. Ранее аналогичного результата можно было добиться только с менее удобным синтаксисом, например: "SELECT arrayReduce('groupArraySample(3)', range(10))". #54391 (itayisraelov).
  • Введены агрегатные комбинаторы -ArgMin/-ArgMax, которые позволяют агрегировать по минимальным/максимальным значениям. Один из вариантов применения описан в #54818. Этот PR также реорганизует комбинаторы в отдельную папку. #54947 (Amos Bird).
  • Теперь можно сбрасывать кэш для формата Protobuf с помощью команды SYSTEM DROP SCHEMA FORMAT CACHE [FOR Protobuf]. #55064 (Aleksandr Musorin).
  • Добавлен внешний аутентификатор HTTP Basic. #55199 (Aleksei Filatov).
  • Добавлена функция byteSwap, которая переставляет байты беззнаковых целых чисел в обратном порядке. Это особенно полезно для обращения значений типов, которые внутренне хранятся как беззнаковые целые числа, например IPv4. #55211 (Priyansh Agrawal).
  • Добавлена функция formatQuery, которая возвращает отформатированный вариант строки SQL-запроса (возможно, с переводами строк). Также добавлена функция formatQuerySingleLine, которая делает то же самое, но возвращаемая строка не будет содержать символов перевода строки. #55239 (Salvatore Mesoraca).
  • Добавлен формат входных данных DWARF, который считывает отладочные символы из ELF-исполняемого файла, библиотеки или объектного файла. #55450 (Michael Kolupaev).
  • Позволяет сохранять неразобранные записи и ошибки в движках RabbitMQ, NATS и FileLog. Добавляет виртуальные столбцы _error и _raw_message (для NATS и RabbitMQ), _raw_record (для FileLog), которые заполняются, когда ClickHouse не может разобрать новую запись. Поведение контролируется настройками хранилища nats_handle_error_mode для NATS, rabbitmq_handle_error_mode для RabbitMQ, handle_error_mode для FileLog по аналогии с kafka_handle_error_mode. Если параметр имеет значение default, при невозможности разбора записи в ClickHouse будет сгенерировано исключение; если установлено значение stream, ошибка и исходная запись будут сохранены в виртуальные столбцы. Закрывает #36035. #55477 (Kruglov Pavel).
  • Улучшение клиента Keeper: добавлена команда get_all_children_number, которая возвращает общее количество дочерних узлов по указанному пути. #55485 (guoxiaolong).
  • Улучшение клиента Keeper: добавлена команда get_direct_children_number, возвращающая число непосредственных дочерних узлов по указанному пути. #55898 (xuzifu666).
  • Добавлен оператор SHOW SETTING setting_name, который является упрощённой версией существующего оператора SHOW SETTINGS. #55979 (Maksim Kita).
  • Добавлены столбцы substreams и filenames в таблицу system.parts_columns. #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).
  • По умолчанию задан разумный размер кэша меток для вторичных индексов, чтобы избежать повторной загрузки меток. #55654 (Alexey Milovidov).
  • Избегать ненужной реконструкции гранул индекса при чтении пропускающих индексов. Это устраняет #55653. #55683 (Amos Bird).
  • Кэшировать функцию CAST в наборе во время выполнения для повышения производительности функции IN, когда тип элементов набора не совпадает с типом столбца. #55712 (Duc Canh Le).
  • Повышена производительность ColumnVector::insertMany и ColumnVector::insertManyFrom. #55714 (frinkr).
  • Оптимизированы операции обращения по индексу в Map за счёт предсказания позиции ключа в следующей строке и сокращения числа сравнений. #55929 (lgbo).
  • Добавлена поддержка отсечения полей структур в Parquet (в предыдущих версиях в некоторых случаях это не работало). #56117 (lgbo).
  • Добавлена возможность настраивать число параллельных реплик, используемых при выполнении запроса, в зависимости от оценки числа строк для чтения. #51692 (Raúl Marín).
  • Оптимизировано потребление памяти при внешней агрегации при большом количестве временных файлов. #54798 (Nikita Taranov).
  • Распределённые запросы, выполняемые в режиме async_socket_for_remote (по умолчанию), теперь соблюдают ограничение max_threads. Ранее некоторые запросы могли создавать чрезмерное количество потоков (до max_distributed_connections), что вызывало проблемы с производительностью сервера. #53504 (filimonov).
  • Кэширование пропускаемых записей при выполнении DDL-операций из распределённой очереди DDL в ZooKeeper. #54828 (Duc Canh Le).
  • Экспериментальные инвертированные индексы не хранят токены со слишком большим числом совпадений (т.е. идентификаторов строк в списке вхождений). Это экономит место и предотвращает неэффективные обращения к индексу в случаях, когда последовательное сканирование будет столь же быстрым или даже быстрее. Предыдущая эвристика (параметр density, передаваемый в определение индекса), определяющая, когда токены не должны сохраняться, была слишком запутанной для пользователей. Введена гораздо более простая эвристика на основе параметра max_rows_per_postings_list (значение по умолчанию: 64k), который напрямую ограничивает максимально допустимое количество идентификаторов строк в списке вхождений. #55616 (Harry Lee).
  • Улучшена производительность операций записи в таблицы EmbeddedRocksDB. #55732 (Duc Canh Le).
  • Улучшена общая отказоустойчивость ClickHouse в случае большого количества частей внутри партиции (более 1000). Это может уменьшить число ошибок TOO_MANY_PARTS. #55526 (Nikita Mikhaylov).
  • Снижено потребление памяти при загрузке иерархических словарей. #55838 (Nikita Taranov).
  • Все словари поддерживают настройку параметра dictionary_use_async_executor. #55839 (vdimir).
  • Предотвращено чрезмерное потребление памяти при десериализации AggregateFunctionTopKGenericData. #55947 (Raúl Marín).
  • На узле Keeper с большим количеством watches потоки AsyncMetrics могут на заметное время загружать ЦП на 100% в DB::KeeperStorage::getSessionsWithWatchesCount. Исправление состоит в том, чтобы избежать обхода тяжёлых множеств watches и list_watches. #56054 (Alexander Gololobov).
  • Добавлена настройка optimize_trivial_approximate_count_query для использования приближённого варианта count для хранилища EmbeddedRocksDB. Включён тривиальный подсчёт для StorageJoin. #55806 (Duc Canh Le).

Улучшение

  • Функции toDayOfWeek (MySQL-алиас: DAYOFWEEK), toYearWeek (YEARWEEK) и toWeek (WEEK) теперь поддерживают аргументы типа String. Это делает их поведение соответствующим поведению MySQL. #55589 (Robert Schulze).
  • Добавлена настройка date_time_overflow_behavior с возможными значениями ignore, throw, saturate, которая определяет поведение при переполнении при преобразовании из типов Date, Date32, DateTime64, Integer или Float в Date, Date32, DateTime или DateTime64. #55696 (Andrey Zvonov).
  • Реализована поддержка параметров запроса в ALTER TABLE ... ACTION PARTITION [ID] {parameter_name:ParameterType}. Объединяет изменения из #49516. Закрывает #49449. #55604 (alesapin).
  • Выводить идентификаторы процессоров в EXPLAIN в более удобочитаемом виде. #48852 (Vlad Seliverstov).
  • Попытка создать прямой словарь с параметром lifetime будет отклонена на этапе создания (так как срок жизни не имеет смысла для прямых словарей). Исправления: #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, например RENAME db.t1 to db.t2. #55373 (凌涛).
  • Добавлен internal_replication в таблицу system.clusters. #55377 (Konstantin Morozov).
  • Выбор удалённого прокси-резолвера на основе протокола запроса, добавление документации по функциональности прокси и удаление DB::ProxyConfiguration::Protocol::ANY. #55430 (Arthur Passos).
  • Не повторять операции Keeper при INSERT после остановки таблицы. #55519 (Azat Khuzhin).
  • SHOW COLUMNS теперь корректно отображает тип FixedString как BLOB, если включена настройка use_mysql_types_in_show_columns. Также добавлены две новые настройки — mysql_map_string_to_text_in_show_columns и mysql_map_fixed_string_to_text_in_show_columns — для переключения вывода типов String и FixedString как TEXT или BLOB. #55617 (Serge Klochkov).
  • Во время запуска таблиц ReplicatedMergeTree сервер ClickHouse проверяет набор частей (parts) на наличие неожиданных частей (существуют локально, но отсутствуют в 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-объекты, что позволяет сохранить совместимость с функцией Spark to_json и также полезно для gluten. #55956 (李扬).
  • Функции (add|sub)Date теперь поддерживают аргументы с датой в строковом формате, например SELECT addDate('2023-10-22 11:12:13', INTERVAL 5 MINUTE). Та же поддержка аргументов с датой в строковом формате добавлена к операторам сложения и вычитания, например SELECT '2023-10-23' + INTERVAL 1 DAY. Это повышает совместимость с MySQL и необходимо для Tableau Online. #55960 (Robert Schulze).
  • Разрешить строки без кавычек, содержащие CR (\r), в формате CSV. Закрывает #39930. #56046 (Kruglov Pavel).
  • Добавлена возможность запускать clickhouse-keeper с использованием встроенной конфигурации. #56086 (Maksim Kita).
  • Установлено ограничение максимального значения настройки queued.min.messages, чтобы избежать проблем при запуске выборки данных из Kafka. #56121 (Stas Morozov).
  • Исправлена опечатка в SQL-функции minSampleSizeContinous (переименована в minSampleSizeContinuous). Старое имя сохранено для обратной совместимости. Это закрывает: #56139. #56143 (Dorota Szeremeta).
  • Теперь перед завершением работы сервера выводится путь к повреждённым частям данных на диске. До этого изменения, если часть данных была повреждена на диске и сервер не мог запуститься, было почти невозможно понять, какая именно часть сломана. Теперь это исправлено. #56181 (Duc Canh Le).

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

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

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

  • Пропускать создание жёстких ссылок на файлы инвертированного индекса при выполнении мутации #47663 (cangyin).
  • Исправлена ошибка в функции match (regex), из‑за которой шаблон, содержащий альтернативу, приводил к некорректному ключевому условию. Закрывает #53222. #54696 (Yakov Olkhovskiy).
  • Исправлена ошибка 'Cannot find column' в оптимизации чтения по порядку (read-in-order) с 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).
  • Исправлено отсечение партиций по дополнительным столбцам в наборе. #55172 (Amos Bird).
  • Исправлен пересчёт пропускающих индексов в запросах ALTER UPDATE для таблиц с адаптивной гранулярностью #55202 (Duc Canh Le).
  • Исправлена фоновая загрузка в fs-кэше #55252 (Kseniia Sumarokova).
  • Предотвращены возможные утечки памяти в компрессорах при отсутствии финализации буфера #55262 (Azat Khuzhin).
  • Исправлено выполнение функций для разрежённых столбцов #55275 (Azat Khuzhin).
  • Исправлено некорректное слияние Nested для SELECT FINAL FROM SummingMergeTree #55276 (Azat Khuzhin).
  • Исправлена ошибка, из-за которой было невозможно удалить отсоединённую партицию в ReplicatedMergeTree поверх 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).
  • Исправлен индикатор прогресса для функций S3Cluster и AzureCluster при использовании URL-адресов без масок (globs) #55666 (Kruglov Pavel).
  • Исправлена фильтрация по виртуальным столбцам при использовании оператора OR в запросе (повторная отправка) #55678 (Azat Khuzhin).
  • Исправления и улучшения в хранилище Iceberg #55695 (Kruglov Pavel).
  • Исправлена гонка данных в CreatingSetsTransform (v2) #55786 (Azat Khuzhin).
  • Выбрасывать исключение при разборе некорректной строки как числа с плавающей запятой, если precise_float_parsing установлен в true #55861 (李扬).
  • Отключить проталкивание предикатов, если CTE содержит состояния́зависимые функции #55871 (Raúl Marín).
  • Исправлена нормализация ASTSelectWithUnionQuery, которая удаляла FORMAT из запроса #55887 (flynn).
  • Попытка исправить возможную ошибку сегментации в формате ввода Native ORC #55891 (Kruglov Pavel).
  • Исправлены оконные функции для разрежённых столбцов. #55895 (János Benjamin Antal).
  • исправлено: StorageNull теперь поддерживает подстолбцы #55912 (FFish).
  • Не записывать повторимые ошибки для операций Replicated mutate/merge в журнал ошибок #55944 (Azat Khuzhin).
  • Исправлена ошибка в SHOW DATABASES LIMIT &lt;N&gt; #55962 (Raúl Marín).
  • Исправлена автоматически сгенерированная схема Protobuf с полями, содержащими символ подчеркивания #55974 (Kruglov Pavel).
  • Исправлена функция dateTime64ToSnowflake64() при нестандартном масштабе #55983 (Robert Schulze).
  • Исправлена обработка ввода/вывода словарного столбца Arrow #55989 (Kruglov Pavel).
  • Исправлено получение схемы из реестра схем в AvroConfluent #55991 (Kruglov Pavel).
  • Исправлена ошибка «Block structure mismatch» при одновременных операциях ALTER и INSERT в таблице Buffer #55995 (Michael Kolupaev).
  • Исправлен некорректный учёт свободного места для политики JBOD least_used #56030 (Azat Khuzhin).
  • Исправлена проблема с отсутствующим скалярным значением при вычислении подзапросов внутри табличных функций #56057 (Amos Bird).
  • Исправлен некорректный результат запроса при http_write_exception_in_output_format=1 #56135 (Kruglov Pavel).
  • Исправлен кэш схемы для резервного варианта JSON->JSONEachRow при изменении настроек #56172 (Kruglov Pavel).
  • Добавлен обработчик ошибок в odbc-bridge #56185 (Yakov Olkhovskiy).

Релиз ClickHouse 23.9, 2023-09-28

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

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

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

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

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

  • Ускорено чтение из S3 за счет включения опережающей выборки (prefetch) по умолчанию. #53709 (Alexey Milovidov).
  • Не считывать неявно столбцы первичного ключа и версии в отдельных партах, если это не требуется для запросов с FINAL. #53919 (Duc Canh Le).
  • Оптимизировано GROUP BY с константными ключами. Оптимизирует запросы с GROUP BY по _file/_path после https://github.com/ClickHouse/ClickHouse/pull/53529. #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 используется отдельная логика, можно немного повысить производительность для аргументов других типов и сделать часть кода чище. Продолжение #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).
  • Соблюдать max_block_size при выполнении array join, чтобы избежать возможного OOM. Закрывает #54290. #54664 (李扬).
  • Повторное использование HTTP‑соединений в табличной функции s3. #54812 (Michael Kolupaev).
  • Линейный поиск в MergeTreeRangeReader::Stream::ceilRowsToCompleteGranules заменён бинарным поиском. #54869 (usurai).

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

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

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

  • Обновлён компилятор для официальных сборок ClickHouse и сборок непрерывной интеграции с Clang 16 до Clang 17. #53831 (Robert Schulze).
  • Повторно сгенерированы TLD-данные для поиска (tldLookup.generated.cpp). #54269 (Bharat Nallan).
  • Удалена избыточная символьная ссылка clickhouse-keeper-client. #54587 (Tomas Barton).
  • Используется /usr/bin/env для поиска интерпретатора bash — теперь поддерживается 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 без padding’а, тогда как Turbo-Base64 пытается декодировать их по принципу best effort. RFC-4648 прямо не устанавливает, является ли padding обязательным, но в зависимости от контекста это может быть изменением поведения, о котором следует помнить. #54119 (Mikhail Koviazin).

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

  • Исправлена работа REPLACE/MOVE PARTITION с репликацией без копирования данных (примечание: «zero-copy replication» — экспериментальная возможность) #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).
  • Исправлена проблема с ограничением ввода-вывода (I/O throttling) при копировании целых каталогов #53338 (Azat Khuzhin).
  • Исправление: при переносе действий в условие PREWHERE мог теряться столбец #53492 (Yakov Olkhovskiy).
  • Исправлена внутренняя ошибка при замене на байтово идентичные части #53735 (Pedro Riera).
  • Исправление: требовать наличие столбцов, участвующих в выражении interpolate #53754 (Yakov Olkhovskiy).
  • Исправлены инициализация обнаружения кластера и настройка fail points (точек отказа) в конфигурации #54113 (vdimir).
  • Исправлены ошибки в accurateCastOrNull #54136 (Salvatore Mesoraca).
  • Исправлена работа nullable-первичного ключа с модификатором FINAL #54164 (Amos Bird).
  • Исправлена ошибка, из-за которой при наличии дубликатов данных не выполнялась вставка новых данных в реплицируемое материализованное представление. #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 для non analyzer #54449 (Azat Khuzhin).
  • Исправлены агрегатные проекции с нормализованными состояниями #54480 (Amos Bird).
  • clickhouse-local: доработки для параметра multiquery #54498 (CuiShuoGuo).
  • clickhouse-local поддерживает аргумент командной строки --database #54503 (vdimir).
  • Исправлена потенциальная ошибка парсинга в форматах -WithNames при отключённом input_format_with_names_use_header #54513 (Kruglov Pavel).
  • Исправлен редкий случай возникновения ошибки CHECKSUM_DOESNT_MATCH #54549 (alesapin).
  • Исправлена сортировка операции UNION ALL над уже отсортированными результатами #54564 (Vitaly Baranov).
  • Исправлена установка снапшота в Keeper #54572 (Antonio Andelic).
  • Исправлено условие гонки в ColumnUnique #54575 (Nikita Taranov).
  • Индекс Annoy/Usearch: исправлена LOGICAL_ERROR при построении с использованием значений по умолчанию #54600 (Robert Schulze).
  • Исправлена сериализация ColumnDecimal #54601 (Nikita Taranov).
  • Исправлено определение схемы для функций *Cluster для имён столбцов с пробелами #54635 (Kruglov Pavel).
  • Исправлено использование структуры таблиц для вставки при значениях по умолчанию и явном указании столбцов вставки #54655 (Kruglov Pavel).
  • Исправлено: больше не используется сопоставление по регулярному выражению, которое может содержать альтернацию, в качестве ключевого условия. #54696 (Yakov Olkhovskiy).
  • Исправлено поведение ReplacingMergeTree при вертикальном слиянии и очистке #54706 (SmitaRKulkarni).
  • Исправлена проблема, из-за которой виртуальные столбцы содержали некорректные значения после ORDER BY #54811 (Michael Kolupaev).
  • Исправлена фильтрация частей с indexHint для non-analyzer #54825 #54449 (Azat Khuzhin).
  • Исправлен сегфолт Keeper при завершении работы #54841 (Antonio Andelic).
  • Исправлена ошибка Invalid number of rows in Chunk в MaterializedPostgreSQL #54844 (Kseniia Sumarokova).
  • Перенесены устаревшие настройки формата в отдельный раздел #54855 (Kruglov Pavel).
  • Перестроить minmax_count_projection при изменении ключа разбиения на партиции #54943 (Amos Bird).
  • Исправлено некорректное приведение типа к ColumnVector<Int128> в функции if #55019 (Kruglov Pavel).
  • Предотвращено присоединение частей из таблиц с разными проекциями или индексами #55062 (János Benjamin Antal).
  • Сохранять NULL в карте скалярных результатов при пустом результате подзапроса #52240 (vdimir).
  • Исправлена ошибка, из-за которой FINAL в редких случаях формировал некорректные диапазоны чтения #54934 (Nikita Taranov).
  • Fix: вставка с кворумом без повторных попыток Keeper #55026 (Igor Nikonov).
  • Исправлено простое состояние с Nullable #55030 (Pedro Riera).

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

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

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

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

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

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

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

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

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

Улучшение

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

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

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

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

  • Не сбрасывать (экспериментальный) индекс Annoy во время построения, если имеется более одной метки #51325 (Tian Xinhui).
  • Исправлено использование временных каталогов при выполнении RESTORE #51493 (Azat Khuzhin).
  • Исправлена работа двоичной арифметики для Nullable(IPv4) #51642 (Yakov Olkhovskiy).
  • Поддержка типов данных IPv4 и IPv6 в качестве атрибутов словарей #51756 (Yakov Olkhovskiy).
  • Исправление контрольной суммы маркеров сжатия #51777 (SmitaRKulkarni).
  • Исправлен ошибочный разбор запятой как части значения datetime при разборе CSV в режиме best effort #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).
  • Исправлен неожиданный результат сортировки по нескольким столбцам с вариантом размещения NULL-значений сначала (NULLS FIRST) #52761 (copperybean).
  • Исправлена гонка данных при перенастройке Keeper #52804 (Antonio Andelic).
  • Исправлена сортировка разреженных столбцов с большим значением LIMIT #52827 (Anton Popov).
  • clickhouse-keeper: исправлена реализация сервера с использованием 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 TABLE для MySQL #52962 (Duc Canh Le).
  • Преобразование разреженного формата столбца в полный в CreateSetAndFilterOnTheFlyStep #53000 (vdimir).
  • Исправлено редкое состояние гонки при удалении каталога в fs cache с пустым префиксом ключа #53055 (Kseniia Sumarokova).
  • Исправлена проблема, из-за которой ZstdDeflatingWriteBuffer иногда усекал выходные данные #53064 (Michael Kolupaev).
  • Исправлено поле query_id в part_log при асинхронном сбросе запросов #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 NORMAL-проекции #53347 (Amos Bird).
  • Запрещено использование параметра use_structure_from_insertion_table_in_table_functions при выполнении Scalar #53348 (flynn).
  • Исправлена загрузка «ленивой» базы данных во время выполнения запроса SELECT к таблице system.table #53372 (SmitaRKulkarni).
  • Исправлены system.data_skipping_indices для MaterializedMySQL #53381 (Filipp Ozinov).
  • Исправлена обработка одиночного символа возврата каретки в движке сегментации файлов TSV #53407 (Kruglov Pavel).
  • Исправлена ошибка Context has expired #53433 (Michael Kolupaev).
  • Исправлена работа timeout_overflow_mode при наличии подзапроса в правой части выражения IN #53439 (Duc Canh Le).
  • Исправлено неожиданное поведение в #53152 #53440 (Zhiguo Zhou).
  • Исправлена ошибка разбора функции JSON_QUERY, возникающая, если путь состоит только из цифр #53470 (KevinyhZou).
  • Исправлен некорректный порядок столбцов для запросов с параллельным FINAL. #53489 (Nikolai Kochetov).
  • Исправлена выборка (SELECT) из ReplacingMergeTree при использовании do_not_merge_across_partitions_select_final #53511 (Vasily Nemkov).
  • Сначала очищать очередь асинхронных вставок при завершении работы #53547 (joelynch).
  • Исправлен сбой при выполнении JOIN по разреженному столбцу #53548 (vdimir).
  • Исправлено возможное неопределённое поведение в пропускающем индексе Set для функций с некорректными аргументами #53559 (Azat Khuzhin).
  • Исправлено возможное неопределённое поведение (UB) в инвертированных индексах (экспериментальная функция) #53560 (Azat Khuzhin).
  • Исправлено: выражение interpolate берет исходный столбец вместо одноимённого столбца с алиасом из выражения SELECT. #53572 (Yakov Olkhovskiy).
  • Исправлено число отброшенных гранул в EXPLAIN PLAN index=1 #53616 (wangxiaobo).
  • Корректная обработка разделов TOTALS и EXTREMES с помощью DelayedSource #53644 (Antonio Andelic).
  • Исправлено зависание кэша подготовленных наборов в конвейере мутаций #53645 (Nikolai Kochetov).
  • Исправлена ошибка в мутациях с подколонками типа JSON в предикатах запросов UPDATE и DELETE. #53677 (VanDarkholme7).
  • Исправлено проталкивание фильтров для соединения full_sorting_merge join #53699 (vdimir).
  • Попытка исправить ошибку в NULL::LowCardinality(Nullable(...)) NOT IN #53706 (Andrey Zvonov).
  • Исправление: сортированного DISTINCT с разрежёнными столбцами #53711 (Igor Nikonov).
  • transform: корректная обработка столбца по умолчанию с несколькими строками #53742 (Salvatore Mesoraca).
  • Исправлен сбой фаззера в функции parseDateTime #53764 (Robert Schulze).
  • MaterializedPostgreSQL: исправлено неперехваченное исключение в getCreateTableQueryImpl #53832 (Kseniia Sumarokova).
  • Исправлена потенциальная ошибка сегментации при использовании движка PostgreSQL #53847 (Kseniia Sumarokova).
  • Исправлен алиас named_collection_admin #54066 (Kseniia Sumarokova).

Релиз ClickHouse 23.7, 2023-07-27

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

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

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

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

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

  • Включить автоматический выбор разреженного формата сериализации по умолчанию. Это улучшает производительность. Формат поддерживается, начиная с версии 22.1. После этого изменения откат на версии ниже 22.1 может быть невозможен. Для отката может потребоваться установить ratio_of_defaults_for_sparse_serialization=0.9375 55153. Вы можете отключить использование разреженного формата сериализации, задав настройку ratio_of_defaults_for_sparse_serialization = 1 для ваших таблиц MergeTree. #49631 (Alexey Milovidov).
  • Включены параметры move_all_conditions_to_prewhere и enable_multiple_prewhere_read_steps по умолчанию. #46365 (Alexander Gololobov).
  • Улучшает производительность некоторых запросов за счёт настройки аллокатора памяти. #46416 (Azat Khuzhin).
  • Теперь в MergeTreePrefetchedReadPool используются задачи фиксированного размера, аналогично MergeTreeReadPool. Кроме того, для запросов к S3 теперь используется пул подключений. #49732 (Nikita Taranov).
  • Расширено проталкивание условий на правую сторону соединения. #50532 (Nikita Taranov).
  • Улучшено соединение grace_hash за счёт резервирования размера хеш-таблицы (повторная отправка). #50875 (lgbo).
  • Ожидание блокировки в OpenedFileCache иногда заметно сказывалось. Мы шардировали его на несколько подотображений (каждое со своей блокировкой), чтобы уменьшить конкуренцию за блокировку. #51341 (Nikita Taranov).
  • Перемещайте условия со столбцами первичного ключа (PK) в конец цепочки PREWHERE. Идея в том, что условия со столбцами PK, скорее всего, будут использоваться в PK-анализе и не дадут заметного дополнительного эффекта для фильтрации PREWHERE. #51958 (Alexander Gololobov).
  • Ускорена операция COUNT(DISTINCT) для типов String за счёт инлайнинга SipHash. Эксперименты по производительности OnTime на устройстве ICX (процессор Intel Xeon Platinum 8380, 80 ядер, 160 потоков) показывают, что это изменение даёт улучшение на 11.6% по QPS запроса Q8 без влияния на другие запросы. #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. Также max_file_segment_size был увеличен с 8Mi до 32Mi в этом PR. #51000 (Kseniia Sumarokova).
  • Уменьшены значения таймаутов по умолчанию для S3 с 30 до 3 секунд, а для прочих HTTP-запросов — со 180 до 30 секунд. #51171 (Michael Kolupaev).
  • Добавлена новая настройка merge_tree_determine_task_size_by_prewhere_columns. Если установлена в значение true, при определении размера задания на чтение будут учитываться только размеры столбцов из секции PREWHERE. В противном случае учитываются все столбцы из запроса. #52606 (Nikita Taranov).

Улучшение

  • Используйте read_bytes/total_bytes_to_read для индикатора выполнения в табличных функциях s3/file/url/... для более наглядного отображения прогресса. #51286 (Kruglov Pavel).
  • Добавлена настройка таблицы wait_for_unique_parts_send_before_shutdown_ms, которая задаёт время, в течение которого реплика будет ждать перед закрытием межсерверного обработчика для реплицированных отправок. Также исправлена несогласованность в порядке завершения работы таблиц и межсерверных обработчиков: теперь сервер сначала завершает работу таблиц и только после этого останавливает межсерверные обработчики. #51851 (alesapin).
  • Разрешено использование оператора FETCH стандарта SQL без OFFSET. См. https://antonz.org/sql-fetch/. #51293 (Alexey Milovidov).
  • Добавлена возможность фильтрации HTTP-заголовков для табличных функций URL/S3 с помощью нового раздела http_forbid_headers в конфигурации. Доступны как точное соответствие, так и фильтры на основе регулярных выражений. #51038 (Nikolay Degterinsky).
  • Не отображать в логах сообщения о 16 EiB свободного места, так как они не имеют смысла. Это закрывает #49320. #49342 (Alexey Milovidov).
  • Исправлена проверка ограничения для функции sleepEachRow. Добавлена настройка function_sleep_max_microseconds_per_block. Это необходимо для универсального фаззера запросов. #49343 (Alexey Milovidov).
  • Исправлены две ошибки в функциях geoHash. #50066 (李扬).
  • Логировать запросы сброса асинхронных вставок в system.query_log. #51160 (Raúl Marín).
  • Функции date_diff и age теперь поддерживают единицы измерения миллисекунды и микросекунды и работают с микросекундной точностью. #51291 (Dmitry Kardymon).
  • Улучшен парсинг пути в clickhouse-keeper-client. #51359 (Azat Khuzhin).
  • В стороннем продукте, который зависит от ClickHouse (Gluten: плагин для двукратного увеличения производительности Spark SQL), была ошибка. Это исправление позволяет избежать переполнения кучи в этом стороннем продукте при чтении из HDFS. #51386 (李扬).
  • Добавлена возможность отключить нативное копирование для S3 (настройка для BACKUP/RESTORE allow_s3_native_copy и s3_allow_native_copy для дисков s3/s3_plain). #51448 (Azat Khuzhin).
  • Добавлен столбец primary_key_size в таблицу system.parts, отображающий сжатый размер первичного ключа на диске. Закрывает #51400. #51496 (Yarik Briukhovetskyi).
  • Позволяет запускать clickhouse-local без procfs, без домашнего каталога и без плагинов разрешения имён из glibc. #51518 (Alexey Milovidov).
  • Добавлен плейсхолдер %a для полного имени файла в настройке rename_files_after_processing. #51603 (Kruglov Pavel).
  • Добавлен столбец modification_time в таблицу system.parts_columns. #51685 (Azat Khuzhin).
  • Добавлена новая настройка input_format_csv_use_default_on_bad_values для формата CSV, которая позволяет вставлять значение по умолчанию, если разбор отдельного поля не удался. #51716 (KevinyhZou).
  • Добавлена принудительная запись журнала аварий на диск после непредвиденного сбоя. #51720 (Alexey Gerasimchuck).
  • Исправлено поведение на странице дашборда, при котором ошибки, не связанные с аутентификацией, не отображались. Также исправлено поведение диаграммы в режиме «overlapping». #51744 (Zach Naimon).
  • Добавлено преобразование UUID в UInt128. #51765 (Dmitry Kardymon).
  • Добавлена поддержка функции range для аргументов типа Nullable. #51767 (Dmitry Kardymon).
  • Условия вида toyear(x) = c теперь преобразуются в c1 <= x < c2. #51795 (Han Fei).
  • Улучшена совместимость оператора SHOW INDEX с MySQL. #51796 (Robert Schulze).
  • Исправлена проблема, из-за которой use_structure_from_insertion_table_in_table_functions не работала со столбцами MATERIALIZED и ALIAS. Закрывает #51817. Закрывает #51019. #51825 (flynn).
  • Кэширующий словарь теперь запрашивает только уникальные ключи из источника. Закрывает #51762. #51853 (Maksim Kita).
  • Исправлена проблема, при которой настройки не применялись для запроса EXPLAIN при указании FORMAT. #51859 (Nikita Taranov).
  • Добавлена возможность указывать SETTINGS перед FORMAT в запросе DESCRIBE TABLE для совместимости с запросом SELECT. Закрывает #51544. #51899 (Nikolay Degterinsky).
  • Целые числа, кодируемые с помощью VarInt (например, используемого нативным протоколом), теперь могут использовать весь 64-битный диапазон значений. Сторонним клиентам рекомендуется обновить свой код работы с VarInt соответствующим образом. #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-адресов и первый из них недоступен, возникало исключение по таймауту. Реализовано создание сессии с обработкой всех разрешённых 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).
  • Возвращён отсутствующий projection QueryAccessInfo при query_plan_optimize_projection = 1, что исправляет #50183. Это также исправляет #50093. #52327 (Amos Bird).
  • Когда ZooKeeperRetriesControl повторно выбрасывает ошибку, гораздо полезнее видеть её исходный стек-трейс, а не тот, который формируется в самом ZooKeeperRetriesControl. #52347 (Vitaly Baranov).
  • Ожидать блокировку zero-copy репликации, даже если некоторые диски её не поддерживают. #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). Этот синтаксис может быть изменён в этом релизе.
  • (экспериментальный MaterializedMySQL) Исправлен сбой при использовании mysqlxx::Pool::Entry после его отключения. #52063 (Val Doroshchuk).
  • (экспериментальный MaterializedMySQL) CREATE TABLE ... AS SELECT теперь поддерживается в MaterializedMySQL. #52067 (Val Doroshchuk).
  • (экспериментальный MaterializedMySQL) Введена автоматическая конверсия текстовых типов в UTF-8 для MaterializedMySQL. #52084 (Val Doroshchuk).
  • (экспериментальный MaterializedMySQL) Теперь в DDL для MaterializedMySQL поддерживаются строки в UTF-8, не заключённые в кавычки. #52318 (Val Doroshchuk).
  • (экспериментальный MaterializedMySQL) Теперь в MaterializedMySQL поддерживаются комментарии в двойных кавычках. #52355 (Val Doroshchuk).
  • Обновлён Intel QPL с v1.1.0 до v1.2.0, обновлён Intel accel-config с v3.5 до v4.0, исправлена проблема, при которой пропуск Device IOTLB сильно влиял на производительность ускорителей IAA. #52180 (jasperzhu).
  • Настройка session_timezone (новая в версии 23.6) переведена в разряд экспериментальных. #52445 (Alexey Milovidov).
  • Добавлена поддержка команды ZooKeeper reconfig для ClickHouse Keeper с инкрементальной переконфигурацией, которую можно включить с помощью настройки keeper_server.enable_reconfiguration. Поддерживается добавление серверов, удаление серверов и изменение приоритетов серверов. #49450 (Mike Kot). Предполагается, что эта возможность реализована не полностью.

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

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

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

  • Исправлена синхронизация таблиц в 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).
  • Исправлено несоответствие структуры Block в Pipe::unitePipes при использовании FINAL #51492 (Nikita Taranov).
  • Исправлена ошибка SIGSEGV для кластеров, у которых на всех шардах вес равен нулю (исправляет INSERT INTO FUNCTION clusterAllReplicas()) #51545 (Azat Khuzhin).
  • Исправлен таймаут для резервных запросов (hedged requests) #51582 (Azat Khuzhin).
  • Исправлена логическая ошибка в соединении ANTI JOIN с NULL #51601 (vdimir).
  • Исправлен перенос условий IN в PREWHERE #51610 (Alexander Gololobov).
  • Не применять оптимизатор PredicateExpressionsOptimizer к ASOF/ANTI join #51633 (vdimir).
  • Исправлена асинхронная вставка с дедупликацией в 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) для словаря диапазонов (range dictionary) #52187 (Duc Canh Le).
  • Исправлен тест sticky mutations (и крайне редкое условие гонки) #52197 (alesapin).
  • Устранена гонка в Web-диске #52211 (Kseniia Sumarokova).
  • Исправлена гонка данных в Connection::setAsyncCallback при обработке неизвестного пакета от сервера #52219 (Kruglov Pavel).
  • Исправлено удаление временных данных при запуске, добавлен тест #52275 (vdimir).
  • Не используйте проекции minmax_count при подсчёте столбцов типа Nullable #52297 (Amos Bird).
  • MergeTree/ReplicatedMergeTree должны использовать часовой пояс сервера для записей логов #52325 (Azat Khuzhin).
  • Исправлено параметризованное представление с CTE при многократном использовании #52328 (SmitaRKulkarni).
  • Отключить шаблоны выражений для временных интервалов #52335 (Alexander Tokmakov).
  • Исправлена функция apply_snapshot в Keeper #52358 (Antonio Andelic).
  • Обновлён build-osx.md #52377 (AlexBykovski).
  • Исправлено зависание countSubstrings при пустой подстроке и столбце 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).
  • Исправлена проблема с выполнением операции LIGHTWEIGHT DELETE после удаления проекции #52517 (Anton Popov).
  • Исправлена потенциальная ошибка "Cannot drain connections: cancel first" #52585 (Kruglov Pavel).

Релиз ClickHouse 23.6, 2023-06-29

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

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

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

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

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

  • Улучшено планирование задач выбора слияний и очистки в ReplicatedMergeTree. Задачи не будут выполняться слишком часто, когда нет данных для слияния или очистки. Добавлены настройки max_merge_selecting_sleep_ms, merge_selecting_sleep_slowdown_factor, max_cleanup_delay_period и cleanup_thread_preferred_points_per_iteration. Это изменение должно закрыть #31919. #50107 (Alexander Tokmakov).
  • Реализовано проталкивание фильтра через 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).
  • Выполняются несколько запросов на получение списка в ZooKeeper параллельно для ускорения чтения из таблицы system.zookeeper. #51042 (Alexander Gololobov).
  • Ускорена инициализация таблиц поиска значений DateTime для часовых поясов. Это должно сократить время запуска/подключения clickhouse-client, особенно в debug-сборке, так как операция достаточно тяжёлая. #51347 (Alexander Gololobov).
  • Исправлено снижение производительности в озёрах данных (data lakes) из‑за синхронных запросов HEAD (связано с медленной работой Iceberg/Deltalake/Hudi при большом количестве файлов). #50976 (Kseniia Sumarokova).
  • Не выполняется чтение всех столбцов из правой таблицы GLOBAL JOIN. #50721 (Nikolai Kochetov).

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

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

Улучшение

  • Ослаблены пороги для состояния «too many parts», чтобы соответствовать современным требованиям. Восстановлен механизм обратного давления (backpressure) во время длительных запросов INSERT. #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).
  • Поле total_bytes_to_read добавлено в пакет Progress протокола TCP для улучшения индикатора прогресса. #51158 (Kruglov Pavel).
  • Улучшена проверка частей данных на дисках с файловым кэшем. #51164 (Anton Popov).
  • Исправлено периодически некорректное значение current_elements_num в кэше файловой системы. #51242 (Kseniia Sumarokova).

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

  • Во встроенный standalone-бинарник keeper добавлен embedded keeper-client. #50964 (pufit).
  • Теперь используется актуальная версия LZ4. #50621 (Nikita Taranov).
  • Сервер ClickHouse будет выводить список изменённых настроек при фатальных ошибках. Это закрывает #51137. #51138 (Alexey Milovidov).
  • Разрешена сборка ClickHouse с clang-17. #51300 (Alexey Milovidov).
  • Проверка SQLancer считается стабильной, так как ошибки, которые ею выявлялись, исправлены. Теперь сбои проверки SQLancer будут помечаться как неуспешный статус проверки. #51340 (Ilya Yatsishin).
  • Один большой RUN в Dockerfile разделён на несколько меньших условных команд. Необходимые инструменты устанавливаются по требованию в том же слое RUN и затем удаляются. Обновление ОС выполняется только один раз в начале. Используется современный способ проверки подписанного репозитория. Базовый образ понижен до ubuntu:20.04 для устранения проблем на старых версиях Docker. Обновлена версия 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).
  • Резервный вариант: разбор большого целого из String вместо генерации исключения в формате Parquet #50873 (Kruglov Pavel).
  • Исправлено слишком частое обращение к файлу блокировки при создании резервной копии #50889 (Vitaly Baranov).
  • Не применять проекцию, если включён режим последовательного чтения (read-in-order). #50923 (Nikolai Kochetov).
  • Исправлена гонка данных в итераторе Azure Blob Storage #50936 (SmitaRKulkarni).
  • Исправлено некорректное распространение sort_description в CreatingSets #50955 (Nikita Taranov).
  • Исправлен разбор необязательных метаданных Iceberg v2 #50974 (Kseniia Sumarokova).
  • MaterializedMySQL: оставлять круглые скобки для переопределения пустых таблиц #50977 (Val Doroshchuk).
  • Исправлено падение в BackupCoordinationStageSync::setError() #51012 (Vitaly Baranov).
  • Исправлена малозаметная ошибка в механизме copy-on-write словаря ColumnLowCardinality #51064 (Michael Kolupaev).
  • Генерировать безопасные векторы инициализации (IV) #51086 (Salvatore Mesoraca).
  • Исправлена неэффективная работа кэша запросов для запросов SELECT с подзапросами #51132 (Robert Schulze).
  • Исправлена работа индекса Set при сравнении с константой Nullable. #51205 (Nikolai Kochetov).
  • Исправлено аварийное завершение работы функций s3 и s3Cluster #51209 (Nikolay Degterinsky).
  • Исправлен сбой при работе со скомпилированными выражениями #51231 (LiuNeng).
  • Исправлена ошибка use-after-free в StorageURL при переключении URL-адресов #51260 (Michael Kolupaev).
  • Обновлена проверка для параметризованного представления #51272 (SmitaRKulkarni).
  • Исправлена проблема многократной записи одного и того же файла в резервную копию #51299 (Vitaly Baranov).
  • Исправлен сбой фаззера в ActionsDAG #51301 (Alexey Milovidov).
  • Удалён лишний код из функции transform #51350 (Alexey Milovidov).

Релиз ClickHouse 23.5, 2023-06-08

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

  • По умолчанию включено сжатие меток и первичного ключа. Это значительно сокращает время выполнения холодных запросов. Заметки по обновлению: поддержка сжатых меток и первичного ключа была добавлена в версии 22.9. Если вы включили сжатые метки или первичный ключ или установили версию 23.5 или новее, в которой сжатые метки или первичный ключ включены по умолчанию, вы не сможете выполнить откат на версию 22.8 или более раннюю. Вы также можете явно отключить сжатие меток или первичного ключа, указав настройки compress_marks и compress_primary_key в секции <merge_tree> файла конфигурации сервера. Заметки по обновлению: Если вы обновляетесь с версий до 22.9 включительно, вам следует либо обновить все реплики одновременно, либо отключить сжатие перед обновлением, либо выполнить обновление через промежуточную версию, в которой сжатые метки поддерживаются, но не включены по умолчанию, например 23.3. #42587 (Alexey Milovidov).
  • Обеспечить единообразную работу локального объектного хранилища и объектного хранилища S3, исправить проблему с добавлением (закрывает #48465), сделать его настраиваемым как независимое хранилище. Изменение не обратно совместимо, поскольку кэш поверх локального объектного хранилища не совместим с предыдущими версиями. #48791 (Kseniia Sumarokova).
  • Экспериментальная функция "in-memory data parts" удалена. Формат данных по‑прежнему поддерживается, но настройки больше не оказывают эффекта, и вместо него будут использоваться 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 для уменьшения дублирования кода. Реализован вывод схемы (schema inference) для всех возможных сигнатур функций *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).
  • Добавлена поддержка полного и правого соединения с использованием алгоритма 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 для словарей на основе деревьев regexp возвращать значения для нескольких совпадений в виде массивов. Закрывает #50254. #50255 (Johann Gan).
  • Добавлена функция toLastDayOfWeek для округления даты или даты со временем вверх до ближайшей субботы или воскресенья. #50315 (Victor Krasnov).
  • Возможность игнорировать индексы пропуска данных с помощью параметра ignore_data_skipping_indices. #50329 (Boris Kuschel).
  • Добавлена таблица system.user_processes и запрос SHOW USER PROCESSES для отображения сведений об использовании памяти и ProfileEvents на уровне пользователей. #50492 (János Benjamin Antal).
  • Добавлены серверные настройки и настройки формата display_secrets_in_show_and_select для отображения секретов таблиц, баз данных, табличных функций и словарей. Добавлена привилегия displaySecretsInShowAndSelect, управляющая тем, какие пользователи могут просматривать секреты. #46528 (Mike Kot).
  • Добавлена возможность настроить ROW POLICY для всех таблиц, принадлежащих DATABASE. #47640 (Ilya Golshtein).

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

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

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

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

Улучшение

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

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

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

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

  • ActionsDAG: исправлена некорректная оптимизация #47584 (Salvatore Mesoraca).
  • Корректно обрабатывать конкурентные снапшоты в Keeper #48466 (Antonio Andelic).
  • MergeTreeMarksLoader теперь содержит DataPart вместо DataPartStorage #48515 (SmitaRKulkarni).
  • Исправление состояния последовательности #48603 (Ilya Golshtein).
  • Проверка конкурентного выполнения операций Back/Restore при предыдущих сбоях #48726 (SmitaRKulkarni).
  • Исправлена ошибка, из-за которой присоединение таблицы с несуществующим ZK-путём не увеличивало метрику ReadonlyReplica #48954 (wangxiaobo).
  • Исправлены возможные вызовы функции terminate при необработанных исключениях в некоторых местах #49112 (Kruglov Pavel).
  • Исправлена ошибка «ключ не найден» для запросов с несколькими 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-словарей с SHARDS #49319 (Azat Khuzhin).
  • Запретить настройку кодеков сжатия для столбцов-алиасов #49363 (Timur Solodovnikov).
  • Исправлена ошибка при удалении каталога существующей части #49365 (alesapin).
  • Исправлена работа GCS при использовании HMAC #49390 (Antonio Andelic).
  • Исправлена ошибка fuzz‑тестирования, из‑за которой набор подзапроса не строился при чтении из remote() #49425 (Alexander Gololobov).
  • Инвертировано значение настройки shutdown_wait_unfinished_queries #49427 (Konstantin Bogdanov).
  • (Экспериментальная репликация с нулевым копированием) Исправлена ещё одна ошибка, связанная с нулевым копированием #49473 (alesapin).
  • Исправлена настройка базы данных Postgres #49481 (Mal Curtis).
  • Исправлена обработка аргументов s3Cluster #49490 (Antonio Andelic).
  • Исправлена ошибка в деструкторе TraceCollector. #49508 (Yakov Olkhovskiy).
  • Исправлена ошибка, из-за которой AsynchronousReadIndirectBufferFromRemoteFS некорректно работал при коротких операциях seek #49525 (Michael Kolupaev).
  • Исправлен порядок загрузки словарей #49560 (Alexander Tokmakov).
  • Запретить изменение типа данных для столбца Object('json') #49563 (Nikolay Degterinsky).
  • Исправлен стресс-тест (логическая ошибка: Expected 7134 >= 11030) #49623 (Kseniia Sumarokova).
  • Исправлена ошибка в операторе DISTINCT #49628 (Alexey Milovidov).
  • Исправлено: DISTINCT в ORDER BY с нулевыми значениями в неотсортированных столбцах #49636 (Igor Nikonov).
  • Исправлена off-by-one ошибка в больших целых числах, обнаруженная 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", возникающая при выполнении мутации lightweight delete над таблицей с колонкой типа Object. #49737 (Alexander Gololobov).
  • Устранена ошибка msan в randomStringUTF8(uneven number) #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).
  • Исправлена обработка ожидающего батча для асинхронного INSERT в Distributed после перезапуска #49884 (Azat Khuzhin).
  • Исправлена проверка assert в CacheMetadata::doCleanup #49914 (Kseniia Sumarokova).
  • исправлен параметр is_prefix в OptimizeRegularExpression #49919 (Han Fei).
  • Исправлены метрики WriteBufferFromS3Bytes, WriteBufferFromS3Microseconds и WriteBufferFromS3RequestsErrors #49930 (Aleksandr Musorin).
  • Исправлена кодировка IPv6 в Protobuf #49933 (Yakov Olkhovskiy).
  • Исправлена возможная логическая ошибка при некорректном разборе Nullable в текстовых форматах #49960 (Kruglov Pavel).
  • Добавлена настройка output_format_parquet_compliant_nested_types для создания более совместимых файлов Parquet #50001 (Michael Kolupaev).
  • Исправлена логическая ошибка в стресс-тесте "Not enough space to add ..." #50021 (Kseniia Sumarokova).
  • Предотвращена взаимоблокировка при запуске таблицы в потоке attach ReplicatedMergeTree #50026 (Antonio Andelic).
  • Исправлен assert в SpanHolder::finish() при использовании fibers, попытка 2 #50034 (Kruglov Pavel).
  • Добавлено корректное экранирование контекста OpenTelemetry при сериализации в DDL #50045 (Azat Khuzhin).
  • Исправлено формирование отчётов о повреждённых частях проекций #50052 (Amos Bird).
  • Исправление JIT-компиляции оператора «!= NaN» #50056 (Maksim Kita).
  • Исправлен сбой при использовании базы данных Replicated без аргументов #50058 (Azat Khuzhin).
  • Исправлено падение при использовании multiIf с константным условием и nullable-аргументами #50123 (Anton Popov).
  • Исправлена ошибка некорректного анализа индекса для ключей, связанных с датой #50153 (Amos Bird).
  • не разрешать изменять ORDER BY, когда нет столбцов ORDER BY #50154 (Han Fei).
  • Исправлен некорректный анализ индекса при использовании бинарного оператора с константным аргументом NULL #50177 (Amos Bird).
  • clickhouse-client: запрещено одновременное использование --query и --queries-file #50210 (Alexey Gerasimchuk).
  • Исправлено неопределённое поведение в расширениях 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).
  • Улучшена операция fetch части за счёт более длительного удержания блокировки каталога #50339 (SmitaRKulkarni).
  • Исправлены функции bitShift* при использовании двух константных аргументов #50343 (Kruglov Pavel).
  • Исправлена взаимоблокировка Keeper при возникновении исключения в процессе предварительной обработки запросов. #50387 (frinkr).
  • Исправлено хеширование константных целочисленных значений #50421 (Robert Schulze).
  • Исправлены настройки merge_tree_min_rows_for_seek/merge_tree_min_bytes_for_seek для индексов пропуска данных #50432 (Azat Khuzhin).
  • Ограничено число одновременно выполняющихся задач загрузки устаревших частей #50450 (Nikita Mikhaylov).
  • Исправление в Keeper: применять незакоммиченное состояние после установки снапшота #50483 (Antonio Andelic).
  • Исправлена ошибка некорректной свёртки констант #50536 (Alexey Milovidov).
  • Исправлена логическая ошибка в стресс-тесте (Not enough space to add ...) #50583 (Kseniia Sumarokova).
  • Исправлено преобразование значения Null в LowCardinality(Nullable) в табличной функции values #50637 (Kruglov Pavel).
  • Отменена некорректная оптимизация для RegExpTreeDictionary #50642 (Johann Gan).

Релиз ClickHouse 23.4, 2023-04-26

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

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

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

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

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

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

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

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

Улучшение

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

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

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

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

  • Исправлен журнал system.query_views_log для материализованных представлений (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 over Distributed #48320 (Azat Khuzhin).
  • Исправлена проблема сериализации LowCardinality как словаря Arrow #48361 (Kruglov Pavel).
  • Сброс загрузчика сегмента файла кэша в TemporaryFileStream #48386 (Vladimir C).
  • Исправлена возможная проблема, при которой команда SYSTEM SYNC REPLICA могла зависать при выполнении операций DROP/REPLACE PARTITION #48391 (Azat Khuzhin).
  • Исправлена ошибка запуска при загрузке распределённой таблицы, зависящей от словаря #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).
  • Исправлена ошибка во вложенном отображении для ключей типов IP и UUID #48556 (Yakov Olkhovskiy).
  • Исправлено необработанное исключение при использовании параллельного загрузчика для хешированных словарей #48571 (Azat Khuzhin).
  • Агрегатная функция groupArray корректно работает с пустым результатом для типов, допускающих значение NULL #48593 (lgbo).
  • Исправлена ошибка в Keeper, из-за которой узел иногда не создавался со схемой auth в ACL. #48595 (Aleksei Filatov).
  • Разрешено использовать операторы сравнения IPv4 с UInt #48611 (Yakov Olkhovskiy).
  • Исправлена возможная ошибка кэша #48636 (Kseniia Sumarokova).
  • Асинхронные вставки с пустыми данными больше не будут вызывать исключение. #48663 (Anton Popov).
  • Исправлены зависимости таблиц при неуспешном выполнении операции RENAME TABLE #48683 (Azat Khuzhin).
  • Если первичный ключ содержит дублирующиеся столбцы (что возможно только для проекций), в предыдущих версиях это могло приводить к ошибке #48838 (Amos Bird).
  • Исправление условия гонки в ZooKeeper при выполнении join потоков send_thread/receive_thread #48849 (Alexander Gololobov).
  • Исправлена ошибка unexpected part name при попытке удалить игнорируемую отсоединённую часть при репликации без копирования данных (zero-copy replication) #48862 (Michael Lex).
  • Исправлена ошибка чтения столбца Date32 Parquet/Arrow в столбец другого типа, отличного от Date32 #48864 (Kruglov Pavel).
  • Исправлена ошибка UNKNOWN_IDENTIFIER при выполнении запроса SELECT из таблицы с политикой строк и столбцом, в имени которого есть точки #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).
  • Удалена функциональность «asynchronous connection drain». Соответствующие настройки и метрики также удалены. Это была внутренняя функциональность, поэтому её удаление не должно затронуть пользователей, которые ранее о ней не знали. #47486 (Alexander Tokmakov).
  • Добавлена поддержка 256-битного типа данных Decimal (более 38 цифр) в функциях arraySum/Min/Max/Avg/Product, arrayCumSum/CumSumNonNegative, arrayDifference, при конструировании массивов, операторе IN, параметрах запросов, groupArrayMovingSum, статистических функциях, min/max/any/argMin/argMax, в сетевом протоколе PostgreSQL, движке таблиц и функции MySQL, sumMap, mapAdd, mapSubtract, arrayIntersect. Добавлена поддержка больших целых чисел в arrayIntersect. Статистические агрегатные функции, использующие моменты (такие как corr или различные TTest), будут использовать Float64 как внутреннее представление (ранее использовался Decimal128, но это не имело смысла), и эти функции могут возвращать nan вместо inf в случае бесконечной дисперсии. Некоторые функции были разрешены для типов данных Decimal256, но в предыдущих версиях возвращали Decimal128 — теперь это исправлено. Это закрывает #47569. Это закрывает #44864. Это закрывает #28335. #47594 (Alexey Milovidov).
  • Параметры backup_threads/restore_threads сделаны серверными настройками (вместо пользовательских). #47881 (Azat Khuzhin).
  • Запрещены константные и недетерминированные вторичные индексы. #46839 (Anton Popov).

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

  • Добавлен новый режим распределения нагрузки по репликам с помощью настроек parallel_replicas_custom_key и parallel_replicas_custom_key_filter_type. Если кластер состоит из одного шарда с несколькими репликами, до max_parallel_replicas реплик будут случайным образом выбраны и использованы как шарды. Для каждого такого шарда соответствующий фильтр добавляется к запросу на стороне инициатора перед отправкой на шард. Если кластер состоит из нескольких шардов, поведение будет таким же, как у sample_key, но с возможностью задать произвольный ключ. #45108 (Antonio Andelic).
  • Опция отображения частичного результата при отмене: добавлена настройка запроса partial_result_on_first_cancel, позволяющая отменённому запросу (например, из‑за Ctrl-C) возвращать частичный результат. #45689 (Alexey Perevyshin).
  • Добавлена поддержка любых движков таблиц для временных таблиц (за исключением движков Replicated и KeeperMap). Закрывает #31497. #46071 (Roman Vasin).
  • Добавлена поддержка репликации определяемых пользователем SQL-функций с использованием централизованного хранилища в Keeper. #46085 (Aleksei Filatov).
  • Реализована таблица system.server_settings (аналог system.settings), содержащая настройки сервера. #46550 (pufit).
  • Добавлена поддержка запроса UNDROP TABLE. Закрывает #46811. #47241 (chen).
  • Разрешить раздельную выдачу прав для именованных коллекций (например, чтобы можно было предоставить доступ SHOW/CREATE/ALTER/DROP named collection только к определённым коллекциям, а не ко всем сразу). Закрывает #40894. Добавлен новый тип доступа NAMED_COLLECTION_CONTROL, который по умолчанию не выдаётся пользователю, если он явно не добавлен в конфигурацию пользователя (требуется для выполнения GRANT ALL); кроме того, show_named_collections больше не нужно вручную указывать для пользователя по умолчанию, чтобы он мог иметь полный набор прав доступа, как это было в 23.2. #46241 (Kseniia Sumarokova).
  • Теперь поддерживаются вложенные пользовательские диски. Ранее пользовательские диски поддерживали только плоскую структуру. #47106 (Kseniia Sumarokova).
  • Добавлена функция widthBucket (с псевдонимом WIDTH_BUCKET для совместимости). #42974. #46790 (avoiderboi).
  • Добавлены новые функции parseDateTime/parseDateTimeInJodaSyntax в соответствии с указанной строкой формата. parseDateTime преобразует значение типа String в DateTime, используя синтаксис MySQL, а parseDateTimeInJodaSyntax — используя синтаксис Joda. #46815 (李扬).
  • Используйте dummy UInt8 в качестве структуры по умолчанию табличной функции null. Закрывает #46930. #47006 (flynn).
  • Добавлена поддержка формата даты с запятой, например Dec 15, 2021, в функции parseDateTimeBestEffort. Закрывает #46816. #47071 (chen).
  • Добавлены настройки http_wait_end_of_query и http_response_buffer_size, которые соответствуют URL-параметрам wait_end_of_query и buffer_size для HTTP-интерфейса. Это позволяет изменять эти настройки в профилях. #47108 (Vladimir C).
  • Добавлена таблица system.dropped_tables, которая показывает таблицы, удалённые из баз данных типа Atomic, но ещё не полностью удалённые. #47364 (chen).
  • Добавлен INSTR как псевдоним функции positionCaseInsensitive для совместимости с MySQL. Закрывает #47529. #47535 (flynn).
  • Добавлена функция toDecimalString, позволяющая преобразовывать числа в строку с фиксированной точностью. #47838 (Andrey Zvonov).
  • Добавлена настройка MergeTree max_number_of_mutations_for_replica. Она ограничивает число мутаций частей на реплику до указанного значения. Ноль означает отсутствие ограничения на количество мутаций на реплику (выполнение всё равно может быть ограничено другими настройками). #48047 (Vladimir C).
  • Добавлена функция для работы с типом Map — mapFromArrays, которая позволяет создавать значение типа 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 на серверах с большим количеством процессоров. #47915 (Nikita Taranov).
  • Добавлена возможность выполнять конвейер чтения для словаря DIRECT с источником CLICKHOUSE в нескольких потоках. Чтобы включить её, установите dictionary_use_async_executor=1 в секции SETTINGS для источника в выражении CREATE DICTIONARY. #47986 (Vladimir C).
  • Оптимизирована производительность агрегации с одним nullable-ключом. #45772 (LiuNeng).
  • Реализовано использование индекса tokenbf_v1 в нижнем регистре для функций hasTokenOrNull, hasTokenCaseInsensitive и hasTokenCaseInsensitiveOrNull. #46252 (ltrk2).
  • Оптимизированы функции position и LIKE путём поиска первых двух символов с использованием SIMD. #46289 (Jiebin Sun).
  • Оптимизированы запросы к system.detached_parts, результаты которых могут быть очень большими. Добавлено несколько источников чтения с учётом ограничения размера блока; для каждого блока используется пул потоков ввода-вывода для вычисления размера части, то есть для параллельного выполнения системных вызовов. #46624 (Sema Checherinda).
  • Увеличено значение по умолчанию параметра max_replicated_merges_in_queue для таблиц ReplicatedMergeTree с 16 до 1000. Это позволяет ускорить фоновые операции слияния на кластерах с очень большим количеством реплик, например на кластерах с общим хранилищем в ClickHouse Cloud. #47050 (Alexey Milovidov).
  • Обновлён clickhouse-copier, чтобы использовать GROUP BY вместо DISTINCT для получения списка партиций. Для больших таблиц это сократило время выполнения запроса с более чем 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, если включен экспериментальный Analyzer. #47280 (Maksim Kita).
  • Теперь ReplicatedMergeTree с репликацией без копирования (zero-copy replication) меньше нагружает Keeper. #47676 (alesapin).
  • Исправлено создание материализованного представления с 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).
  • Улучшено сообщение об исключении, если невозможно переместить часть с одного тома/диска на другой. #47032 (alesapin).
  • Добавлена поддержка типа Bool в функции JSONType. Ранее для булевых значений по ошибке возвращался тип Null. #47046 (Anton Popov).
  • Используйте параметр _request_body для настройки предопределённых HTTP‑запросов. #47086 (Constantine Peresypkin).
  • Автоматическое добавление отступов во встроенном SQL-редакторе UI при нажатии Enter. #47113 (Alexey Korepanov).
  • Самоизвлечение с помощью 'sudo' попытается установить uid и gid извлечённых файлов равными идентификаторам текущего пользователя. #47116 (Yakov Olkhovskiy).
  • Ранее второй аргумент функции repeat принимал только тип беззнакового целого числа, поэтому нельзя было передавать значения вроде -1. Такое поведение отличалось от поведения одноимённой функции в Spark. В этом обновлении функция repeat была изменена, чтобы соответствовать поведению функции Spark. Теперь она принимает те же типы входных данных, включая отрицательные целые числа. Для проверки корректности обновлённой реализации были проведены обширные тесты. #47134 (KevinyhZou). Примечание: запись в журнале изменений была переписана с помощью ChatGPT.
  • Удалена часть ::__1 из стек-трейсов. В стек-трейсах отображать std::basic_string&lt;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).
  • Добавлена поддержка типов big int в функции runningDifference. Закрывает #47194. #47322 (Nikolay Degterinsky).
  • Добавлено окно досрочного истечения срока действия для учетных данных S3 с ограниченным сроком действия, чтобы избежать ошибок ExpiredToken в некоторых пограничных случаях. Его можно настроить параметром expiration_window_seconds, значение по умолчанию — 120 секунд. #47423 (Antonio Andelic).
  • Реализована поддержка типов Decimal и Date32 в формате Avro. #47434 (Kruglov Pavel).
  • Если обнаружено прерванное преобразование из Ordinary в Atomic, не запускать сервер и выводить более информативное сообщение об ошибке с инструкциями по устранению неполадок. #47487 (Alexander Tokmakov).
  • Добавлен новый столбец kind в таблицу system.opentelemetry_span_log. Этот столбец хранит значение SpanKind, определённое в OpenTelemetry. #47499 (Frank Chen).
  • Теперь разрешено чтение и запись вложенных массивов в формате Protobuf, используя в качестве имени столбца только имя корневого поля. Ранее имя столбца должно было содержать все вложенные имена полей (например, a.b.c Array(Array(Array(UInt32)))), теперь можно использовать только a Array(Array(Array(UInt32))). #47650 (Kruglov Pavel).
  • Добавлен необязательный модификатор STRICT для SYSTEM SYNC REPLICA, при котором запрос ожидает, пока очередь репликации не опустеет (как и работало до https://github.com/ClickHouse/ClickHouse/pull/45648). #47659 (Alexander Tokmakov).
  • Улучшены названия некоторых логов спанов OpenTelemetry. #47667 (Frank Chen).
  • Предотвращено использование слишком длинных цепочек комбинаторов агрегатных функций (они могут приводить к медленной обработке запросов на стадии анализа). Исправляет #47715. #47716 (Alexey Milovidov).
  • Поддержка подзапросов в параметризованных представлениях; решает #46741 #47725 (SmitaRKulkarni).
  • Исправлена утечка памяти в интеграции с MySQL (воспроизводится при connection_auto_close=1). #47732 (Kseniia Sumarokova).
  • Улучшена обработка ошибок в коде, связанном с параметрами Decimal, благодаря чему сообщения об ошибках стали более информативными. Ранее при передаче некорректных параметров Decimal выводимое сообщение об ошибке было неясным или малополезным. В этом обновлении сообщение об ошибке исправлено и теперь содержит более подробную и полезную информацию, что упрощает выявление и устранение проблем, связанных с параметрами Decimal. #47812 (Yu Feng). Примечание: эта запись в журнале изменений переписана с помощью ChatGPT.
  • Параметр exact_rows_before_limit используется для того, чтобы rows_before_limit_at_least точно отражал количество строк, возвращённых до достижения лимита. Этот pull request исправляет проблемы, возникавшие при выполнении запросов с распределённой обработкой по нескольким шардам или с операциями сортировки. До этого обновления такие сценарии работали не так, как предполагалось. #47874 (Amos Bird).
  • Интроспекция метрик пулов потоков. #47880 (Azat Khuzhin).
  • Добавлены события профиля WriteBufferFromS3Microseconds и WriteBufferFromS3RequestsErrors. #47885 (Antonio Andelic).
  • Добавлены опции --link и --noninteractive (-y) в установщик ClickHouse. Закрывает #47750. #47887 (Nikolay Degterinsky).
  • Исправлено исключение UNKNOWN_TABLE при выполнении ATTACH к материализованному представлению, у которого есть зависимые таблицы, недоступные в данный момент. Это может быть полезно при попытке восстановить состояние из резервной копии. #47975 (MikhailBurdukov).
  • Исправлен случай, когда (необязательный) путь не добавлялся в конфигурацию зашифрованного диска. #47981 (Kseniia Sumarokova).
  • Поддержка CTE (общих табличных выражений) в параметризованных представлениях. Реализация: обновлена, чтобы разрешить параметры запроса при вычислении скалярных подзапросов. #48065 (SmitaRKulkarni).
  • Добавлена поддержка больших целых чисел (U)Int128/(U)Int256, Map с любым типом ключа и DateTime64 с любой точностью (не только 3 и 6). #48119 (Kruglov Pavel).
  • Разрешить пропуск ошибок, связанных с неизвестными значениями enum, в построчных форматах ввода. #48133 (Alexey Milovidov).

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

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

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

  • Исправлен сброс парсера форматов, протестирована обработка некорректных сообщений в Kafka #45693 (Kruglov Pavel).
  • Исправлен подсчёт размера данных в Keeper #46086 (Antonio Andelic).
  • Исправлена ошибка в автоматических повторных попытках выполнения запроса DROP TABLE для таблиц ReplicatedMergeTree и баз данных Atomic. В редких случаях это могло приводить к ошибкам Can't get data for node /zk_path/log_pointer и The specified key does not exist, если сессия ZooKeeper истекала во время выполнения DROP, а новая реплицированная таблица с тем же путем в ZooKeeper создавалась параллельно. #46384 (Alexander Tokmakov).
  • Исправлена некорректная рекурсия псевдонимов при нормализации запросов, которая мешала выполнению некоторых запросов. #46609 (Raúl Marín).
  • Исправлена сериализация и десериализация IPv4/IPv6 в бинарных форматах #46616 (Kruglov Pavel).
  • ActionsDAG: не изменять результат and при оптимизации #46653 (Salvatore Mesoraca).
  • Улучшена отмена запросов при аварийном завершении работы клиента #46681 (Alexander Tokmakov).
  • Исправлены арифметические операции при оптимизации агрегатных функций #46705 (Duc Canh Le).
  • Исправлено возможное аварийное завершение clickhouse-local при выводе схемы JSONEachRow #46731 (Kruglov Pavel).
  • Исправлено изменение просроченной роли #46772 (Vitaly Baranov).
  • Исправлена проблема с накоплением объединённых столбцов PREWHERE на нескольких шагах #46785 (Alexander Gololobov).
  • Использовать начальный диапазон для определения размера файла в HTTP-буфере чтения. Без этого изменения некоторые удалённые файлы не могли быть обработаны. #46824 (Antonio Andelic).
  • Исправлен некорректный индикатор прогресса при использовании URL-таблиц #46830 (Antonio Andelic).
  • Исправлено предупреждение MSan в функции maxIntersections #46847 (Alexey Milovidov).
  • Исправлена ошибка в типе данных Map #46856 (Alexey Milovidov).
  • Исправлены некорректные результаты некоторых запросов с оператором LIKE, когда шаблон LIKE содержит заключённые в кавычки неэкранируемые символы #46875 (Robert Schulze).
  • Исправление: WITH FILL мог приводить к аварийному завершению при обработке пустого блока в FillingTransform #46897 (Yakov Olkhovskiy).
  • Исправлено определение типов date и int из строк в JSON #46972 (Kruglov Pavel).
  • Исправлена ошибка при выборе диска для zero-copy репликации во время операции fetch #47010 (alesapin).
  • Исправлена опечатка в определении службы systemd #47051 (Palash Goel).
  • Исправлена ошибка NOT_IMPLEMENTED при использовании CROSS JOIN с algorithm = auto #47068 (Vladimir C).
  • Исправлена проблема, из-за которой таблице 'ReplicatedMergeTree' не удавалось вставить две похожие записи при настроенном режиме 'InMemory' для параметра 'part_type' (экспериментальная возможность). #47121 (liding1992).
  • Внешние словари / library-bridge: исправлена ошибка «unknown library method 'extDict_libClone'» #47136 (alex filatov).
  • Исправлено состояние гонки в алгоритме grace hash join с LIMIT #47153 (Vladimir C).
  • Исправлена поддержка PREWHERE для конкретных столбцов #47154 (Azat Khuzhin).
  • Устранена возможная взаимоблокировка в Query Status #47161 (Kruglov Pavel).
  • Запрещён INSERT SELECT для той же таблицы Join, так как это приводит к дедлоку #47260 (Vladimir C).
  • Пропускать уже объединённые партиции при слияниях по параметру min_age_to_force_merge_seconds #47303 (Antonio Andelic).
  • Изменена функция find&#95;first&#95;symbols, чтобы она работала как ожидается с find&#95;first&#95;not&#95;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).
  • Исправлена ошибка сериализации кортежа как массива в формате BSONEachRow #47690 (Kruglov Pavel).
  • Исправлено падение в polygonsSymDifferenceCartesian #47702 (pufit).
  • Исправлено чтение сжатых файлов в хранилище File с использованием сжатия zlib и gzip #47796 (Anton Popov).
  • Улучшено обнаружение пустых запросов для PostgreSQL (для драйвера pgx для Go) #47854 (Azat Khuzhin).
  • Исправлена проверка монотонности DateTime для типов LowCardinality #47860 (Antonio Andelic).
  • Использовать restore_threads (вместо backup_threads) для операции RESTORE ASYNC #47861 (Azat Khuzhin).
  • Исправлена работа DROP COLUMN для ReplicatedMergeTree, содержащего проекции #47883 (Antonio Andelic).
  • Исправление механизма восстановления реплицируемой базы данных #47901 (Alexander Tokmakov).
  • Хотфикс для излишне подробных предупреждений в HTTP #47903 (Alexander Tokmakov).
  • Исправлена ошибка «Field value too long» в catboostEvaluate #47970 (Robert Schulze).
  • Исправлена проблема #36971: Watchdog: завершать работу с ненулевым кодом при завершении дочернего процесса #47973 (Коренберг Марк).
  • Исправление ошибки «index file cidx is unexpectedly long» #48010 (SmitaRKulkarni).
  • Исправлен запрос в MaterializedPostgreSQL для получения атрибутов (replica-identity) #48015 (Solomatov Sergei).
  • parseDateTime(): исправлено неопределённое поведение (переполнение знакового целого) #48019 (Robert Schulze).
  • Используйте уникальные имена для записей (Record) в Avro, чтобы избежать повторного использования их схем #48057 (Kruglov Pavel).
  • Корректно настроены тайм-ауты TCP/HTTP-сокетов в Keeper #48108 (Antonio Andelic).
  • Исправлен потенциальный вызов метода через нулевой указатель в формате Avro #48184 (Kruglov Pavel).

Релиз ClickHouse 23.2, 2023-02-23

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

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

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

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

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

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

Улучшение

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

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

  • Включён GWP-ASan, реализованный в рантайме LLVM. Это закрывает #27039. #45226 (Han Fei).
  • Мы хотим сделать наши тесты менее стабильными и более «хрупкими»: добавлена рандомизация настроек MergeTree в тестах. #38983 (Anton Popov).
  • Включена поддержка HDFS на PowerPC, что помогает исправить следующие функциональные тесты: 02113_hdfs_assert.sh, 02244_hdfs_cluster.sql и 02368_cancel_write_into_hdfs.sh. #44949 (MeenaRenganathan22).
  • Добавлен файл unit-файла 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).
  • Исправлен unit-файл службы systemd. #46461 (SuperDJY).
  • Минимальная версия Clang, необходимая для сборки ClickHouse, повышена с 12 до 15. #46710 (Robert Schulze).
  • Обновлён Intel QPL с v0.3.0 до v1.0.0. Библиотека libaccel-config теперь собирается и статически линкуется с библиотекой QPL вместо динамического связывания. #45809 (jasperzhu).

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

  • Сбрасывать данные строго в соответствии с rabbitmq_flush_interval_ms или rabbitmq_max_block_size в StorageRabbitMQ. Закрывает #42389. Закрывает #45160. #44404 (Kseniia Sumarokova).
  • Использовать PODArray для отрисовки в функции sparkBar, чтобы контролировать расход памяти. Закрывает #44467. #44489 (Duc Canh Le).
  • Исправлена ошибка в функциях quantilesExactExclusive и quantilesExactInclusive, из-за которой возвращался неотсортированный элемент массива. #45379 (wujunfu).
  • Исправлено необработанное исключение в HTTPHandler при включённом OpenTelemetry. #45456 (Frank Chen).
  • Не выводите тип Date из восьмизначных чисел. Это может привести к неверному считыванию данных. #45581 (Kruglov Pavel).
  • Исправлена работа настройки odbc_bridge_use_connection_pooling. #45591 (Bharat Nallan).
  • Когда вызывается callback в кэше, может случиться, что этот кэш уже уничтожен. Для безопасной работы мы захватываем члены класса по значению. Это также безопасно для планировщика задач, поскольку он будет деактивирован до уничтожения хранилища. Решает #45548. #45601 (Han Fei).
  • Исправлено повреждение данных при использовании кодеков Delta или DoubleDelta в сочетании с кодеком Gorilla. #45615 (Robert Schulze).
  • Исправлена проверка типов при использовании индекса блум-фильтра N-gram, чтобы избежать ошибочных чтений. #45617 (Antonio Andelic).
  • Было сообщено о нескольких сбоях с ошибкой сегментации в c-ares. Они появились вследствие моих предыдущих pull request'ов. Я исправил их при помощи Александра Токмакова. #45629 (Arthur Passos).
  • Исправлено описание ключа при обнаружении дубликатов первичного ключа. Это может происходить в проекциях. Подробности см. в #45590. #45686 (Amos Bird).
  • Задает метод и уровень сжатия для резервного копирования. Закрывает задачу #45690. #45737 (Pradeep Chhetri).
  • Следует использовать select_query_typed.limitByOffset вместо select_query_typed.limitOffset. #45817 (刘陶峰).
  • При использовании экспериментального анализатора запросы вида SELECT number FROM numbers(100) LIMIT 10 OFFSET 10; возвращают неверные результаты (пустой результат для этого SQL‑запроса). Это вызвано лишним шагом смещения OFFSET, добавленным планировщиком. #45822 (刘陶峰).
  • Обратная совместимость: разрешено неявное сужающее преобразование из UInt64 в IPv4, необходимое для выражения «INSERT ... VALUES ...». #45865 (Yakov Olkhovskiy).
  • Исправлена ошибка в парсере IPv6 для смешанных IPv6/IPv4-адресов с пропущенным первым октетом IPv4-части (например, ::.1.2.3). #45871 (Yakov Olkhovskiy).
  • Добавлен столбец query_kind в таблицу system.processes и в запрос SHOW PROCESSLIST. Удалён дублирующийся код. Исправлена ошибка, из-за которой глобальный параметр конфигурации max_concurrent_select_queries не применялся к запросам с цепочками INTERSECT или EXCEPT. #45872 (Alexey Milovidov).
  • Устранён сбой в функции stochasticLinearRegression. Выявлено с помощью WingFuzz. #45985 (Nikolai Kochetov).
  • Исправлен сбой в запросах SELECT с модификаторами INTERSECT и EXCEPT, которые читают данные из таблиц с включёнными разрежёнными столбцами (их использование определяется настройкой ratio_of_defaults_for_sparse_serialization). #45987 (Anton Popov).
  • Исправлена оптимизация чтения по порядку при сортировке по убыванию (DESC) с FINAL, закрыт #45815. #46009 (Vladimir C).
  • Исправлено чтение несуществующих вложенных столбцов с несколькими уровнями вложенности в compact-частях. #46045 (Azat Khuzhin).
  • Исправлен столбец elapsed в system.processes (значения отличались в 10 раз). #46047 (Azat Khuzhin).
  • Последующее исправление для «Replace domain IP types (IPv4, IPv6) with native» https://github.com/ClickHouse/ClickHouse/pull/43221. #46087 (Yakov Olkhovskiy).
  • Исправлена подстановка переменных окружения в конфигурации, если параметр уже имеет значение. Закрывает #46131. Закрывает #9547. #46144 (pufit).
  • Исправлено некорректное проталкивание предикатов (predicate push down) при использовании GROUPING SETS. Закрывает #45947. #46151 (flynn).
  • Исправлена потенциальная ошибка, из-за которой конвейер мог зависать в fulls_sorting_join с константными ключами. #46175 (Vladimir C).
  • Не преобразуйте функции tuple в литералы при форматировании, чтобы избежать некорректных результатов. #46232 (Salvatore Mesoraca).
  • Исправлена возможная ошибка выхода за пределы при чтении LowCardinality(Nullable) в формате Arrow. #46270 (Kruglov Pavel).
  • Устранена проблема, из-за которой запросы SYSTEM UNFREEZE завершались с исключением CANNOT_PARSE_INPUT_ASSERTION_FAILED. #46325 (Aleksei Filatov).
  • Исправлен возможный сбой, который мог быть вызван переполнением целочисленного значения при десериализации агрегатного состояния функции, хранящей HashTable. #46349 (Nikolai Kochetov).
  • Исправлена возможная ошибка LOGICAL_ERROR при асинхронных вставках некорректных данных в формате VALUES. #46350 (Anton Popov).
  • Исправлена ошибка LOGICAL_ERROR при попытке выполнить ALTER ... MOVE PART ... TO TABLE. Такой тип запроса никогда фактически не поддерживался. #46359 (Alexander Tokmakov).
  • Исправлено определение схемы s3Cluster при параллельной распределённой операции INSERT SELECT, когда включён parallel_distributed_insert_select. #46381 (Kruglov Pavel).
  • Исправлена обработка запросов вида ALTER TABLE ... UPDATE nested.arr1 = nested.arr2 ..., где arr1 и arr2 являются полями одного и того же столбца типа Nested. #46387 (Anton Popov).
  • Планировщик может не суметь запланировать задачу. Если это произошло, вся операция MulityPartUpload должна быть отменена, а UploadHelper должен дождаться завершения уже запланированных задач. #46451 (Dmitry Novik).
  • Исправлен PREWHERE для Merge с разными типами по умолчанию (исправлены некоторые ошибки NOT_FOUND_COLUMN_IN_BLOCK, возникающие, когда тип по умолчанию для столбца отличается; также PREWHERE разрешён, когда тип столбца одинаков во всех таблицах, и запрещён, только если он отличается). #46454 (Azat Khuzhin).
  • Исправлен сбой, который мог возникать при использовании константных значений в ORDER BY. Исправление для #46466. #46493 (Nikolai Kochetov).
  • Не выбрасывать исключение, если на уровне запроса была указана настройка disk, но в секции настроек MergeTree в конфигурации была задана настройка storage_policy. Настройка disk переопределяет значение из конфигурации. #46533 (Kseniia Sumarokova).
  • Исправлена некорректная обработка константного аргумента типа LowCardinality в функции arrayMap. Этот баг мог приводить к сбою с ошибкой сегментации (segfault) в релизной сборке и логической ошибке 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 становится операцией, не выполняющей никаких действий (no-op). #44647 (alesapin).
  • Опция PREALLOCATE для словарей HASHED/SPARSE_HASHED становится операцией без эффекта (no-op). #45388 (Azat Khuzhin). Она больше не дает существенных преимуществ.
  • Кодек Gorilla запрещен для столбцов типов, отличных от Float32 или Float64. #45252 (Robert Schulze). Его использование было бессмысленным и приводило к неконсистентности.
  • Параллельные вставки с кворумом могут работать некорректно с таблицами *MergeTree, созданными с использованием устаревшего синтаксиса. Поэтому поддержка параллельных вставок с кворумом полностью отключена для таких таблиц. Это не затрагивает таблицы, созданные с использованием нового синтаксиса. #45430 (Alexander Tokmakov).
  • Вместо запроса HeadObject используется запрос GetObjectAttributes для получения размера объекта в AWS S3. Это изменение, в частности, исправляет обработку конечных точек без явного указания региона после обновления 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. - Рефакторинг выходных форматов: удалены обратные вызовы (callbacks) на каждую строку, использовавшиеся в Kafka/RabbitMQ/NATS (теперь мы не используем там callbacks), разрешено использовать IRowOutputFormat напрямую, уточнены разделители конца строки и разделители между строками, добавлена возможность сбросить выходной формат, чтобы начать форматирование заново. - Добавлена корректная реализация в функцию formatRow (бонус после рефакторинга форматов). #42777 (Kruglov Pavel).
  • Поддержка чтения и записи Nested-таблиц как List из Struct в формате CapnProto. Чтение и запись Decimal32/64 как Int32/64. Закрывает #43319. #43379 (Kruglov Pavel).
  • Добавлен столбец message_format_string в system.text_log. В столбце содержится шаблон, который использовался для форматирования сообщения. #44543 (Alexander Tokmakov). Это позволяет выполнять различный анализ логов ClickHouse.
  • Реализована попытка автоматически определять заголовки с именами столбцов (и, возможно, типами) для форматов ввода CSV/TSV/CustomSeparated. Добавлены настройки input_format_tsv/csv/custom_detect_header, которые включают это поведение (по умолчанию включены). Закрывает #44640. #44953 (Kruglov Pavel).

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

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

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

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

Улучшение

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

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

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

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

  • Типы IP-адресов домена (IPv4, IPv6) заменены на нативные. #43221 (Yakov Olkhovskiy). Это автоматически устраняет некоторые пропущенные реализации в коде.
  • Исправлен процесс резервного копирования в случае, если мутации принудительно завершаются во время его выполнения. #45351 (Vitaly Baranov).
  • Исправлено сообщение об исключении «Invalid number of rows in Chunk». #41404. #42126 (Alexander Gololobov).
  • Устранено возможное использование неинициализированного значения после выполнения выражений после сортировки. Закрывает #43386 #43635 (Kruglov Pavel).
  • Улучшена обработка NULL в агрегатных комбинаторах, исправлен возможный сбой (segfault) и логическая ошибка при использовании малоизвестной оптимизации optimize_rewrite_sum_if_to_count_if. Закрывает #43758. #43813 (Kruglov Pavel).
  • Исправлены ограничения на настройки в запросах CREATE USER/ROLE. #43993 (Nikolay Degterinsky).
  • Исправлена ошибка с некорректно разбираемым значением по умолчанию для столбца EPHEMERAL в метаданных таблицы. #44026 (Yakov Olkhovskiy).
  • Исправлен разбор некорректного значения версии в настройке совместимости. #44224 (Kruglov Pavel).
  • Операция вычитания интервалов из datetime приведена в соответствие с их добавлением. #44241 (ltrk2).
  • Убрано ограничение на максимальный размер результата представления. #44261 (lizhuoyu5).
  • Устранена возможная логическая ошибка в кэше при do_not_evict_index_and_mrk_files=1. Закрывает #42142. #44268 (Kseniia Sumarokova).
  • Исправлено возможное слишком раннее прерывание записи в кэш в режиме write-through (кэширование могло быть остановлено из-за ошибочного предположения в случаях, когда этого не должно было происходить). #44289 (Kseniia Sumarokova).
  • Исправлен возможный сбой при использовании функции IN с константными аргументами в качестве константного аргумента совместно с типом LowCardinality. Исправлено #44221. #44346 (Nikolai Kochetov).
  • Исправлена поддержка сложных параметров (например, массивов) у параметрических агрегатных функций. Это исправление закрывает #30975. Агрегатная функция sumMapFiltered была непригодна для использования в распределённых запросах до этого изменения. #44358 (Alexey Milovidov).
  • Исправлено чтение ObjectId при выводе схемы BSON. #44382 (Kruglov Pavel).
  • Исправлена гонка состояний, которая могла приводить к преждевременному удалению временных частей до завершения слияния в ReplicatedMergeTree. Эта проблема могла вызывать ошибки вида No such file or directory: xxx. Исправляет #43983. #44383 (alesapin).
  • Некоторые некорректные запросы SYSTEM ... ON CLUSTER при отсутствии имени кластера выполнялись неожиданным образом. Это исправлено — теперь такие запросы завершаются с ошибкой синтаксиса SYNTAX_ERROR, как и должно быть. Исправляет #44264. #44387 (Alexander Tokmakov).
  • Исправлено чтение типа Map в формате ORC. #44400 (Kruglov Pavel).
  • Исправлено чтение столбцов, которых нет во входных данных в форматах Parquet/ORC. Ранее это могло приводить к ошибке INCORRECT_NUMBER_OF_COLUMNS. Закрывает #44333. #44405 (Kruglov Pavel).
  • Ранее функция bar использовала один и тот же символ '▋' (U+258B "Left five eighths block") для отображения как 5/8, так и 6/8 части столбика. Это изменение исправляет такое поведение, используя '▊' (U+258A "Left three quarters block") для отображения 6/8 части столбика. #44410 (Alexander Gololobov).
  • Размещение настроек профиля в конфигурационном файле после ограничений профиля делало эти ограничения неэффективными. #44411 (Konstantin Bogdanov).
  • Исправлена ошибка SYNTAX_ERROR при выполнении запросов EXPLAIN AST INSERT, содержащих данные. Закрывает #44207. #44413 (save-my-heart).
  • Исправлено чтение логических значений в формате CSV при использовании CRLF. Закрывает #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 TABLE. Исправляет #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 из удалённой файловой системы. Исправляет #44709. #44875 (Nikolai Kochetov).
  • Игнорировать ситуации, когда не удаётся прочитать датчики аппаратного мониторинга, и не выводить в логи полное сообщение об исключении. #44895 (Raúl Marín).
  • Используйте значение max_delay_to_insert в случае, если рассчитанное время задержки INSERT превышает значение этой настройки. Связано с #44902. #44916 (Igor Nikonov).
  • Исправлена ошибка Different order of columns in UNION subquery для запросов с UNION. Исправление для #44866. #44920 (Nikolai Kochetov).
  • Задержка для операций INSERT может вычисляться некорректно, в результате всегда может использоваться параметр max_delay_to_insert в качестве задержки вместо правильного значения. Следует использовать простую формулу max_delay_to_insert * (parts_over_threshold/max_allowed_parts_over_threshold), то есть задержка растет пропорционально количеству частей сверх порога. Закрывает #44902. #44954 (Igor Nikonov).
  • Исправлена ошибка в ALTER TABLE TTL, возникавшая, когда широкая часть имела маску легковесного удаления. #44959 (Mingliang Pan).
  • Последующее исправление к замене типов IP-адресов домена (IPv4, IPv6) на нативные #43221. #45024 (Yakov Olkhovskiy).
  • Дополнительное исправление к «Replace domain IP types (IPv4, IPv6) with native» 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).
  • Исправлена ошибка, из-за которой при использовании проекции minmax/count запрос с additional_table_filters возвращал неверный результат (дополнительный фильтр не применялся). #45133 (Nikolai Kochetov).
  • Исправлена ошибка в функции histogram, которая принимала отрицательные значения. #45147 (simpleton).
  • Исправлена неверная nullability столбца в StorageJoin, закрыт #44940. #45184 (Vladimir C).
  • Исправлена перезагрузка настройки background_fetches_pool_size при её увеличении во время работы. #45189 (Raúl Marín).
  • Корректно обрабатывать запросы SELECT к KV-движкам (например, KeeperMap, EmbeddedRocksDB), использующие оператор IN по ключу с подзапросом, возвращающим значение другого типа. #45215 (Antonio Andelic).
  • Исправлена логическая ошибка в SEMI JOIN и join_use_nulls в ряде случаев, закрыты #45163 и #45209. #45230 (Vladimir C).
  • Исправлена ошибка heap-use-after-free при чтении из S3. #45253 (Kruglov Pavel).
  • Исправлена ошибка, возникавшая, когда тип Avro Union имеет форму ['null', Nested type], закрывает #45275. Исправлена ошибка, из-за которой тип bytes некорректно определялся как Float. #45276 (flynn).
  • Выдавать корректное исключение, если явный PREWHERE нельзя использовать для таблицы с движком хранения Merge. #45319 (Antonio Andelic).
  • Под WSL1 Ubuntu самораспаковывающийся дистрибутив ClickHouse не распаковывается из‑за несоответствия: /proc/self/maps сообщает inode 32‑битного файла, тогда как stat — inode 64‑битного. #45339 (Yakov Olkhovskiy).
  • Исправлено состояние гонки при запуске таблицы Distributed (которое могло приводить к многократной обработке файла асинхронной операции INSERT). #45360 (Azat Khuzhin).
  • Исправлена возможная аварийная остановка при чтении из хранилища S3 и табличной функции s3, если запрос ListObject завершался с ошибкой. #45371 (Anton Popov).
  • Исправлено исключение при выполнении запроса SELECT ... FROM system.dictionaries, возникавшее при наличии словаря с некорректной структурой (например, с неверным типом в XML-конфигурации). #45399 (Aleksei Filatov).
  • Исправлен вывод схемы для s3Cluster, когда структура берётся из таблицы, в которую выполняется вставка, в запросах INSERT INTO ... SELECT * FROM s3Cluster. #45422 (Kruglov Pavel).
  • Исправлена ошибка в разборе форматов JSON/BSONEachRow при использовании HTTP, которая могла приводить к использованию значений по умолчанию для некоторых столбцов вместо значений из данных. #45424 (Kruglov Pavel).
  • Исправлена ошибка (Code: 632. DB::Exception: Unexpected data ... after parsed IPv6 value ...) при типизированном разборе типов IP из текстового источника. #45425 (Yakov Olkhovskiy).
  • Закрыт #45297 Добавлена проверка на пустые регулярные выражения. #45428 (Han Fei).
  • Исправлено возможное зависание (вероятно распределённого) запроса. #45448 (Azat Khuzhin).
  • Исправлена возможная взаимоблокировка при включённом allow_asynchronous_read_from_io_pool_for_merge_tree в случае возникновения исключения, выбрасываемого из ThreadPool::schedule. #45481 (Nikolai Kochetov).
  • Исправлена возможная проблема использования таблицы после DETACH. #45493 (Azat Khuzhin).
  • Исправлено редкое аварийное завершение работы при отмене запроса, если во время его выполнения использовался параллельный парсинг. #45498 (Anton Popov).
  • Исправлена гонка между созданием таблицы Distributed и выполнением INSERT в неё (которая могла приводить к ошибке CANNOT_LINK при выполнении INSERT в таблицу). #45502 (Azat Khuzhin).
  • Добавлено корректное значение по умолчанию (SLRU) в геттер политики кэширования. Закрывает #45514. #45524 (Kseniia Sumarokova).
  • Запрещено использование ARRAY JOIN в мутациях; исправляет #42637 #44447 (SmitaRKulkarni).
  • Исправление обработки квалифицированных звёздочек при использовании псевдонима таблицы и трансформера столбца. Устраняет проблему #44736. #44755 (SmitaRKulkarni).

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

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