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

Релиз ClickHouse v21.12, 2021-12-15. Презентация, Видео

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

  • Исправление для возможности, которая ранее вела себя нежелательным образом. Запрещён прямой SELECT для Kafka/RabbitMQ/FileLog. Его можно включить с помощью настройки stream_like_engine_allow_direct_select. Прямой SELECT не будет разрешён, даже если эта настройка включена, при наличии присоединённого materialized view. Для Kafka и RabbitMQ прямой SELECT, если он разрешён, по умолчанию не будет подтверждать сообщения. Чтобы включить подтверждение при прямом SELECT, пользователь должен использовать настройку уровня хранилища kafka{rabbitmq}_commit_on_select=1 (по умолчанию 0). #31053 (Kseniia Sumarokova).
  • Небольшое изменение в поведении новой функции. JSON_VALUE теперь возвращает строку без кавычек. Закрывает #27965. #31008 (Kseniia Sumarokova).
  • Переименование настройки. Добавлена поддержка настраиваемого представления значения NULL для входных форматов TSV/CSV. Исправлена десериализация Nullable(String) во входных форматах TSV/CSV/JSONCompactStringsEachRow/JSONStringsEachRow. Соответственно, output_format_csv_null_representation и output_format_tsv_null_representation переименованы в format_csv_null_representation и format_tsv_null_representation. #30497 (Kruglov Pavel).
  • Дальнейшее удаление уже неиспользуемого кода. Это актуально только в том случае, если вы используете версии ClickHouse старее 20.6. Механизм “выбора лидера” удалён из ReplicatedMergeTree, поскольку начиная с 20.6 поддерживается несколько лидеров. Если вы обновляетесь с более старой версии и какая-либо реплика со старой версией является лидером, сервер не сможет запуститься после обновления. Остановите реплики со старой версией, чтобы новая версия смогла запуститься. После этого откатиться на версию старее 20.6 будет невозможно. #32140 (tavplubix).

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

  • В clickhouse-keeper реализованы дополнительные команды ZooKeeper Four Letter Words: https://zookeeper.apache.org/doc/r3.4.8/zookeeperAdmin.html#sc_zkCommands. #28981 (JackyWoo). Теперь clickhouse-keeper поддерживает все необходимые возможности.
  • Поддержка типа данных Bool. #31072 (kevin wan).
  • Поддержка PARTITION BY в хранилищах File, URL и HDFS, а также в табличной функции INSERT INTO. Закрывает #30273. #30690 (Kseniia Sumarokova).
  • Добавлен CONSTRAINT ... ASSUME ... (без проверки при INSERT). Добавлено преобразование запроса в КНФ (https://github.com/ClickHouse/ClickHouse/issues/11749) для более удобной оптимизации. Добавлено простое переписывание запросов с использованием ограничений (пока поддерживается только простое сопоставление, позже будет добавлена поддержка <,=,>…). Добавлена возможность заменять тяжёлые столбцы на лёгкие, если это возможно. #18787 (Nikita Vasilev).
  • Базовая аутентификация для доступа к функциям http/url. #31648 (michael1589).
  • Поддержка типа INTERVAL в конструкции STEP для модификатора WITH FILL. #30927 (Anton Popov).
  • Добавлена поддержка параллельного чтения из нескольких файлов, а также глоб-шаблонов в предложении FROM INFILE. #30135 (Filatenkov Artur).
  • Добавлена поддержка параметров запроса Identifier для таблиц и баз данных. Закрывает #27226. #28668 (Nikolay Degterinsky).
  • TLDR: Значительно улучшены полнота и согласованность текстовых форматов. Выполнен рефакторинг форматов TSV, TSVRaw, CSV, JSONCompactEachRow и JSONCompactStringsEachRow, устранено дублирование кода, добавлен базовый интерфейс для форматов с суффиксами -WithNames и -WithNamesAndTypes. Добавлены форматы CSVWithNamesAndTypes, TSVRawWithNames, TSVRawWithNamesAndTypes, JSONCompactEachRowWIthNames, JSONCompactStringsEachRowWIthNames, RowBinaryWithNames. Добавлена поддержка параллельного парсинга для форматов TSVWithNamesAndTypes, TSVRaw(WithNames/WIthNamesAndTypes), CSVWithNamesAndTypes, JSONCompactEachRow(WithNames/WIthNamesAndTypes), JSONCompactStringsEachRow(WithNames/WIthNamesAndTypes). Добавлена поддержка сопоставления столбцов и проверки типов для формата RowBinaryWithNamesAndTypes. Добавлена настройка input_format_with_types_use_header, которая определяет, нужно ли проверять, что типы, записанные в формате <format_name>WIthNamesAndTypes, соответствуют структуре таблицы. Добавлена настройка input_format_csv_empty_as_default, которая теперь используется в формате CSV вместо input_format_defaults_for_omitted_fields (поскольку эта настройка не должна управлять csv_empty_as_default). Исправлено использование настройки input_format_defaults_for_omitted_fields (она использовалась только как csv_empty_as_default, хотя должна управлять вычислением выражений значений по умолчанию для пропущенных полей). Исправлен ввод и вывод Nullable в формате TSVRaw, и теперь этот формат полностью совместим со вставкой в TSV. Исправлена вставка NULL в LowCardinality(Nullable) при включенной настройке input_format_null_as_default (раньше вместо фактических NULL вставлялись значения по умолчанию). Исправлена десериализация строк в форматах JSONStringsEachRow/JSONCompactStringsEachRow (строки разбирались только до первого ‘\n’ или ‘\t’). Добавлена возможность использовать правило экранирования Raw во входном формате Template. Добавлена диагностическая информация для входного формата JSONCompactEachRow(WithNames/WIthNamesAndTypes). Исправлена ошибка параллельного парсинга форматов -WithNames в случае, когда значение настройки min_chunk_bytes_for_parallel_parsing меньше числа байт в одной строке. #30178 (Kruglov Pavel). Разрешён вывод и разбор имён и типов столбцов во входном/выходном формате CustomSeparated. Добавлены форматы CustomSeparatedWithNames/WithNamesAndTypes, аналогичные TSVWithNames/WithNamesAndTypes. #31434 (Kruglov Pavel).
  • Поддержка объектного хранилища Aliyun OSS. #31286 (cfcz48).
  • В файл конфигурации добавлены все настройки глобального пула потоков. #31285 (Tomáš Hromada).
  • Добавлены оконные функции exponentialTimeDecayedSum, exponentialTimeDecayedMax, exponentialTimeDecayedCount и exponentialTimeDecayedAvg, которые эффективнее exponentialMovingAverage для больших окон. Также был расширен спектр сценариев использования. #29799 (Vladimir Chebotarev).
  • Добавлена возможность сжатия журналов перед записью в файл с помощью LZ4. Закрывает #23860. #29219 (Nikolay Degterinsky).
  • Реализована поддержка JOIN ON 1 = 1 с семантикой CROSS JOIN. Это закрывает #25578. #25894 (Vladimir C).
  • Добавлен комбинатор Map для типа Map. - Старые sum-, min-, max- Map для массивов с отображением переименованы в sum-, min-, max- MappedArrays. #24539 (Ildus Kurbangaliev).
  • Добавлена возможность повторных попыток при чтении по HTTP. Закрывает #29696. #29894 (Kseniia Sumarokova).

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

  • Поддержка WINDOW VIEW для потоковой обработки в ClickHouse. #8331 (vxider).
  • Убрана поддержка баз данных Ordinary в MaterializedMySQL. #31292 (Stig Bakken).
  • Реализованы команды BACKUP и RESTORE для семейства Log. Эта возможность находится в разработке. #30688 (Vitaly Baranov).

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

  • Снижено использование памяти при чтении в форматах Parquet, ORC, Arrow через s3 / url / hdfs (управляется настройкой input_format_allow_seeks, включенной по умолчанию). Также добавлена настройка remote_read_min_bytes_for_seek для управления операциями seek. Закрывает #10461. Закрывает #16857. #30936 (Kseniia Sumarokova).
  • Добавлены оптимизации для константных условий в JOIN ON, см. #26928. #27021 (Vladimir C).
  • Добавлена поддержка параллельного форматирования для всех текстовых форматов, кроме JSONEachRowWithProgress и PrettyCompactMonoBlock. #31489 (Kruglov Pavel).
  • Ускорен count для столбцов с типом Nullable. #31806 (Raúl Marín).
  • Ускорены агрегатные функции avg и sumCount. #31694 (Raúl Marín).
  • Улучшена производительность выходных форматов JSON и XML. #31673 (alexey-milovidov).
  • Улучшена производительность синхронизации данных с блочным устройством. Это закрывает #31181. #31229 (zhanglistar).
  • Исправлена проблема с производительностью запросов в таблицах LiveView. Исправляет #30831. #31006 (vzakaznikov).
  • Ускорен парсинг запросов. #31949 (Raúl Marín).
  • Добавлена возможность разделять правила rollup GraphiteMergeTree для обычных и тегированных метрик (необязательное поле rule_type). #25122 (Michail Safronov).
  • Удалены лишние запросы DESC TABLE для remote() (в случае remote('127.1', system.one) (то есть при использовании идентификатора вида db.table вместо строки) выполнялся лишний запрос DESC TABLE). #32019 (Azat Khuzhin).
  • Функция tupleElement оптимизирована для чтения подстолбца при включенной настройке optimize_functions_to_subcolumns. #31261 (Anton Popov).
  • Функция mapContains оптимизирована для чтения подстолбца key при включенной настройке optimize_functions_to_subcolumns. #31218 (Anton Popov).
  • Добавлены настройки merge_tree_min_rows_for_concurrent_read_for_remote_filesystem и merge_tree_min_bytes_for_concurrent_read_for_remote_filesystem. #30970 (Kseniia Sumarokova).
  • Добавлен пропуск мутаций для разных партиций в StorageMergeTree. #21326 (Vladimir Chebotarev).

Улучшения

  • Запретить удаление таблицы или словаря, если от них зависят другие таблицы или словари. #30977 (tavplubix).
  • Разрешено версионирование состояний агрегатных функций. Теперь мы можем вносить обратно совместимые изменения в формат сериализации состояний агрегатных функций. Закрывает #12552. #24820 (Kseniia Sumarokova).
  • Поддерживается синтаксис ALTER MODIFY COLUMN в стиле PostgreSQL. #32003 (SuperDJY).
  • Добавлена поддержка update_field в RangeHashedDictionary и ComplexKeyRangeHashedDictionary. #32185 (Maksim Kita).
  • Функции murmurHash3_128 и sipHash128 теперь могут принимать произвольное число аргументов. Это закрывает #28774. #28965 (小路).
  • Поддержка выражений по умолчанию для хранилища HDFS и оптимизация получения данных, когда источник имеет столбцовую структуру. #32256 (李扬).
  • Улучшено имя операции спана OpenTelemetry. #32234 (Frank Chen).
  • Используйте Content-Type: application/x-ndjson (http://ndjson.org/) для формата вывода JSONEachRow. #32223 (Dmitriy Dorofeev).
  • Улучшен пропуск неизвестных полей при использовании правила экранирования кавычками в форматах Template/CustomSeparated. Ранее можно было пропускать только строки в кавычках, теперь — значения любого типа. #32204 (Kruglov Pavel).
  • Теперь clickhouse-keeper отказывается запускаться или применять изменения конфигурации, если в них есть повторяющиеся идентификаторы или конечные точки. Исправлено в #31339. #32121 (alesapin).
  • Установка Content-Type в HTTP-пакетах, отправляемых движком URL. #32113 (Frank Chen).
  • Возвращать заголовок Content-Type со значением ‘application/json’ для формата JSONEachRow, если включена настройка output_format_json_array_of_rows. #32112 (Frank Chen).
  • Разрешён разбор значений Float32/Float64 со знаком +. #32079 (Kruglov Pavel).
  • Разрешена пользовательская настройка параметра hdfs_replication для DiskHDFS и StorageHDFS. Закрывает #32039. #32049 (leosunli).
  • В лог span OpenTelemetry добавлены поля ClickHouse exception и exception_code. #32040 (Frank Chen).
  • Улучшена длительность в логах span’ов OpenTelemetry — на уровне запроса она была нулевой при возникновении исключения запроса. #32038 (Frank Chen).
  • Исправлена проблема, из-за которой не удавалось создать LowCardinality для Int256. #31832 (alexey-milovidov).
  • Пересоздавать таблицы system.*_log, если отличаются движок или partition_by. #31824 (Azat Khuzhin).
  • MaterializedMySQL: Исправлена проблема с таблицей, названной ‘table’. #31781 (Håvard Kvålen).
  • Источник словаря ClickHouse: добавлена поддержка предопределённых подключений. Закрывает #31705. #31749 (Kseniia Sumarokova).
  • Добавлена возможность использовать предопределённую конфигурацию подключений для движков Kafka и RabbitMQ (как и для других интеграционных движков таблиц). #31691 (Kseniia Sumarokova).
  • Всегда повторно отображать промпт при навигации по истории в clickhouse-client. Это повысит удобство работы с очень длинными запросами, которые не помещаются на экране. #31675 (alexey-milovidov) (автор: Amos Bird).
  • Добавлены сочетания клавиш для перемещения по истории (вместо строк/истории). #31641 (Azat Khuzhin).
  • Улучшены проверки max_execution_time. Исправлены некоторые случаи, когда проверки тайм-аута не выполнялись, и запрос мог работать слишком долго. #31636 (Raúl Marín).
  • Более понятное сообщение об ошибке, если users.xml не удаётся загрузить из-за некорректного хеша пароля. Это закрывает #24126. #31557 (Vitaly Baranov).
  • Использовать имена сегмента и реплики из аргументов базы данных Replicated при раскрытии макросов в аргументах ReplicatedMergeTree, если эти макросы не определены в конфигурации. Закрывает #31471. #31488 (tavplubix).
  • Улучшен анализ для проекции min/max/count. Теперь при включенной настройке allow_experimental_projection_optimization виртуальную проекцию min/max/count можно использовать вместе со столбцами из ключа партиционирования. #31474 (Amos Bird).
  • Добавлена поддержка параметра --pager для clickhouse-local. #31457 (Azat Khuzhin).
  • Исправлено зависание при ожидании редактора во время интерактивного редактирования запроса (waitpid() возвращает -1 при SIGWINCH, а EDITOR и clickhouse-local/clickhouse-client могут работать одновременно). #31456 (Azat Khuzhin).
  • Сгенерировать исключение, если после поля в формате JSONCompactStrings(EachRow) есть лишние символы. #31455 (Kruglov Pavel).
  • Значения по умолчанию для настроек http_send_timeout и http_receive_timeout изменены с 1800 (30 минут) на 180 (3 минуты). #31450 (tavplubix).
  • MaterializedMySQL теперь поддерживает DDL-запросы CREATE TABLE ... LIKE .... #31410 (Stig Bakken).
  • Возвращать искусственно сформированный запрос CREATE при выполнении show create table для системных таблиц. #31391 (SuperDJY).
  • Ранее Прогресс отображался только для табличной функции numbers. Теперь он также отображается и для numbers_mt. #31318 (Kseniia Sumarokova).
  • Теперь для поиска политик доступа к строкам используются роли, изначально назначенные пользователю, см. #31080. #31262 (Vitaly Baranov).
  • При изменении какой-либо устаревшей настройки показывать предупреждение в system.warnings. #31252 (tavplubix).
  • Улучшен механизм задержки для фоновых задач очистки в MergeTree. Настройки merge_tree_clear_old_temporary_directories_interval_seconds и merge_tree_clear_old_parts_interval_seconds перенесены из пользовательских настроек в настройки MergeTree. #31180 (tavplubix).
  • Теперь каждая реплика будет отправлять клиенту только инкрементальную информацию о счётчиках profile events. #31155 (Dmitry Novik). Благодаря этому опцию --hardware_utilization в clickhouse-client теперь можно использовать.
  • По умолчанию в clickhouse-client включено многострочное редактирование. Это решает проблему #31121. #31123 (Amos Bird).
  • Нормализация имён функций для запросов ALTER. Это помогает избежать расхождений в метаданных между созданием таблицы с индексами/проекциями и добавлением индексов/проекций через команды ALTER. Это продолжение PR https://github.com/ClickHouse/ClickHouse/pull/20174. Отнесено к улучшениям, так как сообщений об ошибках не было, а такой сценарий встречается довольно редко. #31095 (Amos Bird).
  • Поддержка модификатора IF EXISTS в запросе RENAME DATABASE/TABLE/DICTIONARY. Если используется этот модификатор, ошибка не возникнет, если DATABASE/TABLE/DICTIONARY, которую нужно переименовать, не существует. #31081 (victorgao).
  • Отменять вертикальные слияния при удалении партиции. Это продолжение изменений из https://github.com/ClickHouse/ClickHouse/pull/25684 и https://github.com/ClickHouse/ClickHouse/pull/30996. #31057 (Amos Bird).
  • Локальный сеанс внутри источника словаря ClickHouse больше не будет отправлять свои события в журнал сеансов. Это устраняет возможную взаимную блокировку (предупреждение tsan) при завершении работы. Также в этом PR исправлен нестабильно работающий test_dictionaries_dependency_xml/. #31013 (Vitaly Baranov).
  • Меньше блокировок при выполнении команды ALTER. #31010 (Amos Bird).
  • Исправлена работа опции --verbose в интерактивном режиме clickhouse-local и добавлена возможность логирования в файл. #30881 (Kseniia Sumarokova).
  • В clickhouse-client добавлены команды \l, \d, \c — как в MySQL и PostgreSQL. #30876 (Pavel Medvedev).
  • Для clickhouse-local или clickhouse-client: если опция --interactive используется вместе с --query или --queries-file, сначала выполняются команды, как в неинтерактивном режиме, а затем запускается интерактивный режим. #30851 (Kseniia Sumarokova).
  • Исправлена возможная ошибка “Локальный набор частей X не совпадает с набором частей в ZooKeeper” (если DROP завершается ошибкой при удалении znode из ZooKeeper). #30826 (Azat Khuzhin).
  • Формат Avro теперь работает с Kafka. Добавлена настройка output_format_avro_rows_in_file. #30351 (Ilya Golshtein).
  • Добавлена возможность указывать одну или несколько схем PostgreSQL для одной базы данных MaterializedPostgreSQL. Закрывает #28901. Закрывает #29324. #28933 (Kseniia Sumarokova).
  • Заменены порты по умолчанию для внутреннего взаимодействия clickhouse-keeper: с 44444 на 9234. Исправляет #30879. #31799 (alesapin).
  • Реализована поддержка аргументов Decimal в функции transform. #31839 (李帅).
  • Исправлено аварийное завершение в сервере отладочной сборки и ошибка DB::Exception: std::out_of_range: basic_string в сервере релизной сборки в случае некорректного URL HDFS за счёт добавления дополнительной проверки структуры URL HDFS. #31042 (Kruglov Pavel).
  • Исправлено возможное срабатывание assert в табличной функции/движке hdfs, добавлен тест. #31036 (Kruglov Pavel).

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

  • Исправлена работа псевдонимов для GROUP BY / ORDER BY / LIMIT BY при включенных позиционных аргументах. Закрывает #31173. #31741 (Kseniia Sumarokova).
  • Исправлено использование движка таблицы Buffer с типом Map. Исправление #30546. #31742 (Anton Popov).
  • Исправлено чтение из таблиц MergeTree при включенном параметре use_uncompressed_cache. #31826 (Anton Popov).
  • Исправлено поведение, из-за которого мутации, которым нечего было делать, зависали (при включенной настройке empty_result_for_aggregation_by_empty_set). #32358 (Nikita Mikhaylov).
  • Исправлен пропуск столбцов при записи protobuf. Этот PR исправляет #31160, см. комментарий #31160#issuecomment-980595318. #31988 (Vitaly Baranov).
  • Исправлена ошибка при удалении ненужных столбцов в подзапросе. Если в запросе без GROUP BY есть агрегатная функция, её не следует удалять, даже если она не нужна. #32289 (dongyifeng).
  • Лимит квоты не был достигнут, но ограничение всё равно было превышено. Этот PR исправляет #31174. #31337 (sunny).
  • Исправлена работа SHOW GRANTS при использовании частичного отзыва привилегий. Этот PR исправляет #31138. #31249 (Vitaly Baranov).
  • Объём памяти некорректно оценивался при запуске ClickHouse в контейнерах с ограничениями cgroup. #31157 (Pavel Medvedev).
  • Исправлены запросы ALTER ... MATERIALIZE COLUMN ..., если тип данных выражения по умолчанию не совпадает с типом данных столбца. #32348 (Anton Popov).
  • Исправлено падение с SIGFPE в агрегатной функции avgWeighted с аргументом Decimal. Исправление #32053. #32303 (tavplubix).
  • Сервер мог не запускаться с ошибкой Cannot attach 1 tables due to cyclic dependencies, если таблица Dictionary ссылалась на XML-словарь с тем же именем; проблема исправлена. Исправляет #31315. #32288 (tavplubix).
  • Исправлена ошибка разбора при десериализации значения NaN для Nullable(Float) по правилу экранирования Quoted. #32190 (Kruglov Pavel).
  • XML-словари: идентификаторы, используемые в запросе CREATE TABLE, при обновлении до более новой версии могут быть уточнены с помощью default_database. Закрывает #31963. #32187 (Maksim Kita).
  • Число активных реплик могло определяться некорректно при вставке с кворумом, если на некоторых репликах была отключена настройка replicated_can_become_leader. Это исправлено. #32157 (tavplubix).
  • Словари: исправлены случаи, когда {condition} не работает для произвольных запросов к базе данных. #32117 (Maksim Kita).
  • Исправлена работа CAST с Nullable при использовании cast_keep_nullable (ранее возникала ошибка PARAMETER_OUT_OF_BOUND, например, для toUInt32OrDefault(toNullable(toUInt32(1)))). #32080 (Azat Khuzhin).
  • Исправлена команда CREATE TABLE для хранилища Join в некоторых редких случаях. Закрывает #31680. #32066 (SuperDJY).
  • Исправлена ошибка Directory ... already exists and is not empty при отсоединении части данных. #32063 (tavplubix).
  • MaterializedMySQL (экспериментальная возможность): Исправлена неверная интерпретация данных типа DECIMAL из MySQL. #31990 (Håvard Kvålen).
  • У движка FileLog (экспериментальная возможность) при ошибке создания таблицы без необходимости создавался каталог метаданных. Исправление #31962. #31967 (flynn).
  • Некоторые записи GET_PART могут зависать в очереди репликации, если часть потеряна на всех репликах и в той же партиции нет других частей. Это исправлено для случаев, когда ключ партиционирования содержит только столбцы целочисленных типов или Date[Time]. Исправлено #31485. #31887 (tavplubix).
  • Исправлены функции empty и notEmpty для аргументов типа UUID. Исправление #31819. #31883 (Anton Popov).
  • Изменён путь к конфигурации: с keeper_server.session_timeout_ms на keeper_server.coordination_settings.session_timeout_ms при создании KeeperTCPHandler. То же самое для operation_timeout. #31859 (JackyWoo).
  • Исправлено некорректное приведение типа Nullable при использовании Nullable в первичном ключе. (Использование Nullable в первичном ключе не рекомендуется — пожалуйста, не делайте этого.) Это исправляет #31075. #31823 (Amos Bird).
  • Исправлено аварийное завершение при использовании рекурсивной UDF в SQL. Закрывает #30856. #31820 (Maksim Kita).
  • Исправлено аварийное завершение работы при использовании функции dictGet с типом для атрибута словаря, если тип — Nullable. Исправляет #30980. #31800 (Maksim Kita).
  • Исправлен сбой при пустом результате ODBC-запроса (с некоторыми драйверами ODBC). Закрывает #31465. #31766 (Kseniia Sumarokova).
  • Исправлена ошибка при отключении профилировщика запросов (в случае query_profiler_real_time_period_ns>0/query_profiler_cpu_time_period_ns>0 профилировщик запросов мог оставаться включенным даже после завершения запроса). #31740 (Azat Khuzhin).
  • Исправлен редкий segfault при одновременном выполнении запросов ATTACH PARTITION. #31738 (tavplubix).
  • Исправлено состояние гонки в формате вывода JSONEachRowWithProgress, возникавшее, когда в выводе смешивались данные и строки с информацией о прогрессе. #31736 (Kruglov Pavel).
  • Исправлена ошибка there are no such cluster here, возникавшая при выполнении запроса с предложением ON CLUSTER, если указанное имя кластера совпадало с именем базы данных Replicated. #31723 (tavplubix).
  • Исправлено исключение, возникавшее в некоторых случаях применения функции decrypt к столбцам с типом Nullable. Это закрывает #31662. Это закрывает #31426. #31707 (alexey-milovidov).
  • Исправлена работа функции ngrams, если строка содержит символы UTF-8. #31706 (yandd).
  • Настройки input_format_allow_errors_num и input_format_allow_errors_ratio не работали при разборе доменных типов, таких как IPv4; это исправлено. Исправление #31686. #31697 (tavplubix).
  • Исправлено исключение из-за нулевого указателя в MATERIALIZE COLUMN. #31679 (Nikolai Kochetov).
  • Запрос RENAME TABLE работал некорректно при попытке переименовать DDL-словарь в базе данных Ordinary; это исправлено. #31638 (tavplubix).
  • Агрегатная функция sparkbar реализована так, как и задумывалось, см.: #26175#issuecomment-960353867, комментарий. #31624 (小路).
  • Исправлена генерация некорректного JSON, если только имена столбцов содержат недопустимые последовательности UTF-8. #31534 (Kevin Michel).
  • Отключите partial_merge_join_left_table_buffer_bytes до исправления ошибки в этой оптимизации. См. #31009). Удалите избыточную опцию partial_merge_join_optimizations. #31528 (Vladimir C).
  • Исправлен вывод прогресса для коротких запросов INSERT SELECT. #31510 (Azat Khuzhin).
  • Исправлено некорректное поведение для group by и позиционных аргументов. Закрывает #31280#issuecomment-968696186. #31420 (Kseniia Sumarokova).
  • Устранён nullptr в провайдере учетных данных STS для S3. #31409 (Vladimir Chebotarev).
  • Удалена функция notLike из анализа индексов, так как она работала некорректно. #31169 (sundyli).
  • Исправлена ошибка в Keeper, из-за которой запуск мог стать невозможным, если были утеряны некоторые журналы координации и снимок оказался новее последнего журнала. #31150 (alesapin).
  • Переписана правая distributed таблица в локальный JOIN. Исправляет #25809. #31105 (abel-cheng).
  • Исправлена работа таблицы Merge с псевдонимами и условием WHERE (раньше это вообще не работало). Закрывает #28802. #31044 (Kseniia Sumarokova).
  • Исправлены JSON_VALUE/JSON_QUERY для идентификаторов в кавычках. Это позволяет использовать пробелы в пути JSON. Закрывает #30971. #31003 (Kseniia Sumarokova).
  • Использование функции formatRow с форматами, не ориентированными на строки, приводило к segfault. Не допускайте использования этой функции с такими форматами (поскольку это не имеет смысла). #31001 (Kruglov Pavel).
  • Исправлена ошибка, из-за которой запросы select переставали работать, если выполнялись после удаления materialized view. Обнаружено в #30691. #30997 (Kseniia Sumarokova).
  • Пропускать проверку max_partition_size_to_drop для ATTACH PARTITION … FROM и MOVE PARTITION … #30995 (Amr Alaa).
  • Исправлены некоторые краевые случаи, связанные с операторами INTERSECT и EXCEPT. Закрывает #30803. #30965 (Kseniia Sumarokova).

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

  • Исправлен некорректный результат фильтрации в сборках для архитектур, отличных от x86. Это закрывает #31417. Это закрывает #31524. #31574 (alexey-milovidov).
  • Сборка ClickHouse сделана полностью воспроизводимой (побайтно идентичной на разных машинах). Это закрывает #22113. #31899 (alexey-milovidov). Из бинарных файлов удалён путь в файловой системе к каталогу сборки, чтобы обеспечить воспроизводимость сборок. Это требовалось для #22113. #31838 (alexey-milovidov).
  • Для zlib-ng, cassandra, mariadb-connector-c, xz, re2, sentry, gsasl, arrow и protobuf используются наши собственные CMakeLists. Это требуется для #20151. Часть #9226. Небольшой шаг к удалению раздражающего мусора из системы сборки. #30599 (alexey-milovidov).
  • Герметичные сборки: используется фиксированная версия libc, а также гарантируется, что во время сборки не используются никакие исходные или бинарные файлы из хостовой ОС. Это закрывает #27133. Это закрывает #21435. Это закрывает #30462. #30011 (alexey-milovidov).
  • Добавлена функция getFuzzerData() для упрощения фаззинга отдельных функций. Это закрывает #23227. #27526 (Alexey Boykov).
  • Более корректная настройка привилегий в Docker. #31802 (Constantine Peresypkin).
  • Включены параметры компиляции clang -fstrict-vtable-pointers, -fwhole-program-vtables. #20151 (Maksim Kita).
  • Исключена загрузка tarball-архивов toolchain для кросс-компиляции под FreeBSD. #31672 (alexey-milovidov).
  • Начальная поддержка RISC-V. Подробности о нюансах и протестированной команде сборки см. в development/build-cross-riscv. #31309 (Vladimir Smirnov).
  • Добавлена поддержка компиляции на ARM-машинах с параметром “-DENABLE_TESTS=OFF”. #31007 (zhanghuajie).

Релиз ClickHouse v21.11 от 2021-11-09. Презентация, Видео

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

  • Изменён порядок аргументов json_path и json в функциях SQL/JSON (для соответствия стандарту). Закрывает #30449. #30474 (Kseniia Sumarokova).
  • Удалена настройка таблицы MergeTree write_final_mark. Теперь она всегда равна true. #30455 (Kseniia Sumarokova). Никаких действий не требуется: все таблицы совместимы с новой версией.
  • Функция bayesAB удалена. Пожалуйста, помогите вернуть эту функцию в обновлённом виде. Это закрывает #26233. #29934 (alexey-milovidov).
  • Это актуально только в том случае, если вы уже начали использовать экспериментальную поддержку clickhouse-keeper. Теперь снимки ClickHouse Keeper по умолчанию сжимаются кодеком ZSTD вместо собственного блочного сжатия ClickHouse LZ4. Это поведение можно отключить с помощью настройки координации compress_snapshots_with_zstd_format (она должна быть одинаковой на всех репликах кворума). Обратная несовместимость встречается довольно редко и может возникнуть только тогда, когда новый узел отправляет снимок (это происходит при восстановлении) старому узлу, который не умеет читать снимки в формате ZSTD. #29417 (alesapin).

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

  • Новый асинхронный режим INSERT позволяет накапливать вставляемые данные и в фоновом режиме записывать их одним батчем. На стороне клиента его можно включить, задав async_insert для запросов INSERT с данными, встроенными в запрос, или передаваемыми в отдельном буфере (например, для запросов INSERT через HTTP-протокол). Если wait_for_async_insert имеет значение true (по умолчанию), клиент будет ждать, пока данные не будут записаны в таблицу. На стороне сервера режим управляется настройками async_insert_threads, async_insert_max_data_size и async_insert_busy_timeout_ms. Реализовано в #18282. #27537 (Anton Popov). #20557 (Ivan). Примечание по производительности: с асинхронными вставками можно выполнять до примерно 10 000 отдельных запросов INSERT в секунду, поэтому, если вам нужна производительность до миллионов вставляемых строк в секунду, по-прежнему рекомендуется выполнять вставку батчами.
  • Добавлен интерактивный режим для clickhouse-local. Теперь можно просто запустить clickhouse-local, чтобы получить интерфейс командной строки ClickHouse без подключения к серверу и обрабатывать данные из файлов и внешних источников данных. Также объединён код clickhouse-client и clickhouse-local. Закрывает #7203. Закрывает #25516. Закрывает #22401. #26231 (Kseniia Sumarokova).
  • Добавлена поддержка исполняемых (скриптовых) пользовательских функций. Это UDF, которые можно писать на любом языке программирования. #28803 (Maksim Kita).
  • Разрешены предопределённые подключения к внешним источникам данных. Это позволяет не указывать учётные данные или адреса при использовании внешних источников данных: вместо этого их можно указывать по имени. Закрывает #28367. #28577 (Kseniia Sumarokova).
  • Добавлена база данных INFORMATION_SCHEMA с представлениями SCHEMATA, TABLES, VIEWS и COLUMNS, соответствующими таблицам в базе данных system. Закрывает #9770. #28691 (tavplubix).
  • Добавлена поддержка EXISTS (subquery). Закрывает #6852. #29731 (Kseniia Sumarokova).
  • Журналирование сеансов для аудита. Запись всех успешных и неудачных событий входа в систему и выхода из неё в новую таблицу system.session_log. #22415 (Vasily Nemkov) (Vitaly Baranov).
  • Добавлена поддержка функций многомерного косинусного и евклидова расстояния; расстояний и норм L1, L2, Lp, Linf. Скалярное произведение для Tuple и различные арифметические операторы для Tuple. Это полностью закрывает #4509 и не только. #27933 (Alexey Boykov).
  • Добавлена поддержка сжатия и распаковки для INTO OUTFILE и FROM INFILE (с автоопределением или с указанием дополнительного необязательного параметра). #27135 (Filatenkov Artur).
  • Добавлена поддержка CORS (Cross Origin Resource Sharing) через HTTP-запрос OPTIONS. Это означает, что теперь Grafana сможет работать с бессерверными запросами без костылей. Закрывает #18693. #29155 (Filatenkov Artur).
  • Запросы с JOIN ON теперь поддерживают логические ИЛИ (OR). #21320 (Ilya Golshtein).
  • Добавлена функция tokens. Она позволяет разбивать строку на токены, используя не буквенно-цифровые ASCII-символы в качестве разделителей. #29981 (Maksim Kita). Добавлена функция ngrams для извлечения n-грамм из текста. Закрывает #29699. #29738 (Maksim Kita).
  • Добавлены функции нормализации Unicode: normalizeUTF8NFC, normalizeUTF8NFD, normalizeUTF8NFKC, normalizeUTF8NFKD. #28633 (darkkeks).
  • Потоковое чтение файлов журналов приложений в ClickHouse с движком таблицы FileLog. Это аналог движка Kafka или RabbitMQ, но для журналов в локальной файловой системе с режимом только дозаписи и ротацией. Закрывает #6953. #25969 (flynn) (Kseniia Sumarokova).
  • Добавлен выходной формат CapnProto, переработан входной формат CapnProto. #29291 (Kruglov Pavel).
  • Разрешена запись числа в запросе в виде двоичного литерала. Пример: SELECT 0b001;. #29304 (Maksim Kita).
  • Добавлен тип словаря hashed_array. Он позволяет экономить память при использовании словарей с несколькими атрибутами. Закрывает #30236. #30242 (Maksim Kita).
  • Добавлена функция JSONExtractKeys. #30056 (Vitaly).
  • Добавлена функция getOSKernelVersion, которая возвращает строку с версией ядра ОС. #29755 (Memo).
  • Добавлены функции MD4 и SHA384. MD4 — устаревшая и небезопасная хеш-функция; её можно использовать лишь в редких случаях, когда MD4 уже применяется в какой-то legacy-системе и нужно получить в точности такой же результат. #29602 (Nikita Tikhomirov).
  • HSTS можно включить для HTTP-сервера ClickHouse, указав положительное значение hsts_max_age в конфигурационном файле. #29516 (凌涛).
  • Поддержка объектного хранилища Huawei OBS. Закрывает #24294. #29511 (kevin wan).
  • Новая функция mapContainsKeyLike для получения map, ключи которой соответствуют простому регулярному выражению. #29471 (凌涛). Новая функция mapExtractKeyLike для получения map, в которой остаются только элементы, соответствующие указанному шаблону регулярного выражения. #30793 (凌涛).
  • Добавлена поддержка ALTER TABLE x MODIFY COMMENT. #29264 (Vasily Nemkov).
  • Добавлены функции инспекции H3, которых нет в ClickHouse, но которые доступны через API H3: https://h3geo.org/docs/api/inspection. #29209 (Bharat Nallan).
  • Разрешить нереплицируемые операции ALTER TABLE FETCH и ATTACH в базах данных Replicated. #29202 (Kevin Michel).
  • Добавлена настройка output_format_csv_null_representation: она аналогична output_format_tsv_null_representation, но предназначена для вывода в формате CSV. #29123 (PHO).
  • Добавлена функция zookeeperSessionUptime(), которая возвращает время непрерывной работы текущего сеанса ZooKeeper в секундах. #28983 (tavplubix).
  • Реализована функция h3ToGeoBoundary. #28952 (Ivan Veselov).
  • Добавлена агрегатная функция exponentialMovingAverage, которую можно использовать в качестве оконной функции. Это закрывает #27511. #28914 (alexey-milovidov).
  • Добавлена возможность включать подстолбцы столбцов таблицы в результат запроса DESCRIBE (это можно включить с помощью настройки describe_include_subcolumns). #28905 (Anton Popov).
  • В Executable, ExecutablePool добавлена опция send_chunk_header. Если эта опция включена, то перед фрагментом клиенту будет отправляться rows&#95;count фрагмента с переводом строки. #28833 (Maksim Kita).
  • tokenbf_v1 и ngram поддерживают Map с ключом типа String или FixedSring. Это улучшает пропуск данных в запросах с фильтром по ключу map. sql CREATE TABLE map_tokenbf ( row_id UInt32, map Map(String, String), INDEX map_tokenbf map TYPE ngrambf_v1(4,256,2,0) GRANULARITY 1 ) Engine=MergeTree() Order by id Для приведённой выше таблицы запрос select * from map_tokebf where map['K']='V' будет пропускать гранулы, которые не содержат ключ A . Конечно, сколько строк будет пропущено, зависит от заданных вами granularity и index_granularity. #28511 (凌涛).
  • События профилирования теперь отправляются с сервера клиенту. Введён новый тип пакета ProfileEvents. Закрывает #26177. #28364 (Dmitry Novik).
  • Операции побитового сдвига для типов данных FixedString и String. Это закрывает #27763. #28325 (小路).
  • Добавлена поддержка динамического добавления / удаления таблиц в репликацию из PostgreSQL в движке базы данных MaterializedPostgreSQL. Добавлена поддержка ALTER для настроек базы данных. Закрывает #27573. #28301 (Kseniia Sumarokova).
  • Добавлена функция accurateCastOrDefault(x, T). Закрывает #21330. Автор: @taiyang-li. #23028 (Maksim Kita).
  • Добавлена функция toUUIDOrDefault, toUInt8/16/32/64/256OrDefault, toInt8/16/32/64/128/256OrDefault, позволяющая задавать значение по умолчанию (не NULL) при ошибке разбора строки. #21330 (taiyang-li).

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

  • Фоновые слияния теперь могут прерывать друг друга и планируются с соответствующими приоритетами. Теперь длительные слияния не будут мешать выполнению коротких. Это необходимо для более эффективного планирования и контроля выполнения слияний. Это снижает вероятность возникновения ошибки “too many parts”. #22381. #25165 (Nikita Mikhaylov). Добавлена возможность выполнять больше слияний и мутаций, чем число потоков в фоновом пуле. Слияния и мутации будут выполняться пошагово в зависимости от их размера (меньшие имеют более высокий приоритет). Соотношение числа задач и потоков выполнения регулируется настройкой background_merges_mutations_concurrency_ratio, по умолчанию оно равно 2. #29140 (Nikita Mikhaylov).
  • Добавлена возможность использовать асинхронное чтение для удалённых файловых систем. Снижено количество операций позиционирования при чтении из удалённых файловых систем. Это значительно повышает производительность и позволяет экспериментальным дискам web и s3 в определённых условиях работать быстрее, чем EBS. #29205 (Kseniia Sumarokova). Кроме того, тип диска web (статический набор данных, размещённый на веб-сервере) перешёл из экспериментального статуса в готовый к промышленной эксплуатации.
  • Запросы с INTO OUTFILE в clickhouse-client теперь используют несколько потоков. Исправлена проблема с мерцанием индикатора прогресса при использовании INTO OUTFILE. Это закрывает #30873. Это закрывает #30872. #30886 (alexey-milovidov).
  • Уменьшен объем избыточных сжатых данных, считываемых с диска для некоторых типов запросов SELECT (только для семейства движков MergeTree). #30111 (alesapin).
  • Убраны некоторые избыточные вызовы seek при чтении сжатых блоков в семействе движков таблиц MergeTree. #29766 (alesapin).
  • Табличная функция url теперь может параллельно обрабатывать несколько URL-адресов. Это закрывает #29670 и #29671. #29673 (alexey-milovidov).
  • Повышена производительность агрегации в порядке первичного ключа (при включенной настройке optimize_aggregation_in_order). #30266 (Anton Popov).
  • Теперь ClickHouse использует DNS-кэш при взаимодействии с внешним S3. #29999 (alesapin).
  • Добавлена поддержка pushdown для IS NULL/IS NOT NULL в внешних базах данных (то есть MySQL). #29463 (Azat Khuzhin). isNull/isNotNull преобразуются в IS NULL/IS NOT NULL (для внешних БД, то есть MySQL). #29446 (Azat Khuzhin).
  • SELECT-запросы к таблицам словарей будут выполняться в несколько потоков. #30500 (Maksim Kita).
  • Повышена производительность при фильтрации (операция WHERE) столбцов Decimal. #30431 (Jun Jin).
  • Убран код с ветвлениями в операции фильтрации благодаря более эффективной реализации с использованием popcnt/ctz, обеспечивающей более высокую производительность. #29881 (Jun Jin).
  • Улучшены генератор побайтовой маски фильтра (используемый для оператора WHERE) и функция all in one с инструкциями SSE/AVX2/AVX512. Обратите внимание, что по умолчанию ClickHouse использует только SSE, поэтому это актуально только для нестандартных сборок. #30014 (jasperzhu). #30670 (jasperzhu).
  • Повышена производительность агрегатной функции SUM для чисел с плавающей запятой типа Nullable. #28906 (Raúl Marín).
  • Ускорен процесс загрузки частей, если используется несколько дисков. Идея аналогична https://github.com/ClickHouse/ClickHouse/pull/16423 . В продакшене время сократилось: 24 мин -> 16 мин . #28363 (Amos Bird).
  • Уменьшен размер части multipart-загрузки S3 в настройках по умолчанию, чтобы снизить использование памяти. #28679 (ianton-ru).
  • Ускорена работа функции bitmapAnd. #28332 (dddounaiking).
  • Убраны избыточные уведомления о мутациях в StorageMergeTree, пока всё ещё выполняются слияния. #27552 (Vladimir Chebotarev).
  • Попытка повысить производительность сравнения строк. #28767 (alexey-milovidov).
  • Индекс первичного ключа и фильтр по партиции теперь могут работать с Tuple. #29281 (凌涛).
  • Если запрос содержит несколько агрегатных функций quantile с одинаковыми аргументами, но с разными параметрами уровня, они будут объединены и выполнены за один проход, если включена настройка optimize_syntax_fuse_functions. #26657 (hexiaoting).
  • Теперь агрегирование min-max по первому выражению первичного ключа оптимизируется с помощью проекции. Это сделано для #329. #29918 (Amos Bird).

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

  • Добавлена возможность изменять конфигурацию узлов ClickHouse Keeper (в файле .xml). #30372 (alesapin).
  • Добавлена агрегатная функция sparkbar. Это закрывает #26175. #27481 (小路). Примечание: у этой функции есть один недостаток; её поведение будет изменено в будущих версиях.

Улучшения

  • Пользователи могут менять уровни логирования без перезапуска. #29586 (Nikolay Degterinsky).
  • Несколько улучшений для SQL UDF. Запросы для работы с SQL-пользовательскими функциями теперь поддерживают предложение ON CLUSTER. Пример CREATE FUNCTION test_function ON CLUSTER 'cluster' AS x -> x + 1;. Закрывает #30666. #30734 (Maksim Kita). Добавлена поддержка синтаксиса CREATE OR REPLACE и CREATE IF NOT EXISTS. #30454 (Maksim Kita). Добавлена поддержка DROP IF EXISTS. Пример DROP FUNCTION IF EXISTS test_function. #30437 (Maksim Kita). Добавлена поддержка лямбда-функций. Пример CREATE FUNCTION lambda_function AS x -> arrayMap(element -> element * 2, x);. #30435 (Maksim Kita). Добавлена поддержка SQL-пользовательских функций в clickhouse-local. #30179 (Maksim Kita).
  • Глобально включён профилировщик памяти для каждого запроса (параметр memory_profiler_step установлен в 4MiB). #29455 (Azat Khuzhin).
  • В system.data_skipping_indices добавлены столбцы data_compressed_bytes, data_uncompressed_bytes, marks_bytes. В system.parts добавлены столбцы secondary_indices_compressed_bytes, secondary_indices_uncompressed_bytes, secondary_indices_marks_bytes. Закрывает #29697. #29896 (Maksim Kita).
  • В system.tables добавлен псевдоним table, а в system.databases — псевдоним database #29677. #29882 (kevin wan).
  • Корректно разрешаются взаимозависимости между таблицами при запуске сервера. Закрыты #8004 и #15170. #28373 (tavplubix).
  • Устранена ошибка “Division by zero”, возникавшая, когда знаменатель имел тип Nullable в функциях divide, intDiv и modulo. Закрывает #22621. #28352 (Kruglov Pavel).
  • Теперь значения типа данных Date в текстовых форматах можно разбирать как YYYYMMDD в дополнение к YYYY-MM-DD. Это закрывает #30870. #30871 (alexey-milovidov).
  • Веб-интерфейс: отрисовка столбиков в ячейках таблицы. #29792 (alexey-milovidov).
  • Теперь пользователи могут создавать словари с комментариями: CREATE DICTIONARY ... COMMENT 'vaue'#29899 (Vasily Nemkov). Теперь пользователи могут добавлять комментарии к базам данных в операторе CREATE DATABASE#29429 (Vasily Nemkov).
  • Добавлена настройка compiled_expression_cache_elements_size. Если вам когда-нибудь понадобится использовать эту настройку, вы и так уже будете знать, что она делает. #30667 (Maksim Kita).
  • clickhouse-format теперь поддерживает опцию --query. В предыдущих версиях запрос приходилось передавать через stdin. #29325 (凌涛).
  • Добавлена поддержка ALTER TABLE для таблиц в базах данных Memory. Базы данных Memory используются в clickhouse-local. #30866 (tavplubix).
  • Теперь arrayStringConcat поддерживает массивы любых сериализуемых типов. #30840 (Nickita Taranov).
  • Теперь ClickHouse будет учитывать ограничения docker/cgroups при расчете объема системной памяти. См. #25662. #30574 (Pavel Medvedev).
  • Определение структуры таблицы для базы данных PostgreSQL теперь работает надежнее. #30477 (Kseniia Sumarokova).
  • Полностью поддерживаются позиционные аргументы в GROUP BY и ORDER BY. #30433 (Kseniia Sumarokova).
  • Теперь можно извлекать нестроковые элементы как строки с помощью JSONExtractString. Это сделано для pull/25452#issuecomment-927123287. #30426 (Amos Bird).
  • Добавлена возможность использовать модификатор FINAL в запросах SELECT к GraphiteMergeTree. #30360 (Nikita Mikhaylov).
  • Небольшие улучшения в клонировании реплик и добавлении в очередь операций fetch для повреждённых частей, которые должны предотвратить крайне редкие зависания записей GET_PART в очереди репликации. #30346 (tavplubix).
  • Разрешено использовать символические ссылки на файлы в каталоге user_files в табличной функции file. #30309 (Kseniia Sumarokova).
  • Исправлено сравнение Date32 с Date, DateTime, DateTime64 и String. #30219 (liang.huang).
  • Теперь можно удалять выражение SAMPLE BY из таблиц MergeTree (ALTER TABLE <table> REMOVE SAMPLE BY). #30180 (Anton Popov).
  • Теперь Keeper (как часть clickhouse-server) будет запускаться асинхронно, если сможет подключиться к другому узлу. #30170 (alesapin).
  • Теперь clickhouse-client поддерживает нативное многострочное редактирование. #30143 (Amos Bird).
  • словари polygon (обратное геокодирование): добавлена поддержка чтения содержимого словаря с помощью запроса SELECT, если параметр store_polygon_key_column = true. Закрывает #30090. #30142 (Maksim Kita).
  • В интерфейс Play добавлен логотип ClickHouse. #29674 (alexey-milovidov).
  • Улучшено сообщение об исключении при чтении столбца из форматов с поддержкой Arrow, таких как Arrow, ArrowStream, Parquet и ORC. Это закрывает #29926. #29927 (alexey-milovidov).
  • Исправлена гонка между сбросом и запуском в таблицах Buffer. Это может проявляться в тестах. #29930 (Azat Khuzhin).
  • Исправлена lock-order-inversion при DROP TABLE для DatabaseMemory и LiveView. Live View — экспериментальная возможность. База данных Memory используется в clickhouse-local. #29929 (Azat Khuzhin).
  • Устранена инверсия порядка захвата блокировок между периодической перезагрузкой словаря и перезагрузкой конфигурации. #29928 (Azat Khuzhin).
  • Обновлены файлы zoneinfo до версии 2021c. #29925 (alexey-milovidov).
  • Добавлена возможность настраивать повторные попытки и интервалы между ними для clickhouse-copier. #29921 (Azat Khuzhin).
  • Добавлена настройка сервера shutdown_wait_unfinished_queries, которая позволяет ожидать завершения выполняющихся запросов в течение времени shutdown_wait_unfinished. Связано с #24451. #29914 (Amos Bird).
  • Добавлена возможность отслеживать пиковое потребление памяти (с новым значением trace_type в system.trace_logMemoryPeak). #29858 (Azat Khuzhin).
  • Внешние таблицы PostgreSQL: в запрос для получения индекса replica identity добавлен префикс партиционированной таблицы ‘p’. #29828 (Shoh Jahon).
  • Применяйте max_untracked_memory/memory_profiler_step/memory_profiler_sample_probability при mutate/merge, чтобы профилировать использование памяти во время слияний. #29681 (Azat Khuzhin).
  • Обфускатор запросов: clickhouse-format --obfuscate теперь работает с более широким набором типов запросов. #29672 (alexey-milovidov).
  • Исправлена ошибка: clickhouse-format --obfuscate не может обрабатывать запросы со встроенными словарями (функции regionTo...). #29667 (alexey-milovidov).
  • Исправлена некорректная обработка Nullable в JSON-функциях. Это исправляет #29615. Отмечено как улучшение, поскольку https://github.com/ClickHouse/ClickHouse/pull/28012 ещё не выпущен. #29659 (Amos Bird).
  • Значение listen_backlog по умолчанию увеличено (чтобы соответствовать значению по умолчанию в более новых версиях ядра Linux). #29643 (Azat Khuzhin).
  • Перезагрузка словарей, моделей и пользовательских исполняемых функций при изменении параметров конфигурации сервера dictionaries_config, models_config, user_defined_executable_functions_config. Закрывает #28142. #29529 (Maksim Kita).
  • Снято бессмысленное ограничение на имя проекции. Теперь имя проекции может начинаться с tmp_. #29520 (Amos Bird).
  • Исправлена ошибка There is no query or query context has expired в мутациях с вложенными подзапросами. Подзапросы в мутациях теперь запрещены, если таблица реплицируемая и настройка allow_nondeterministic_mutations отключена. #29495 (tavplubix).
  • Применение изменений конфигурации для max_concurrent_queries во время выполнения (перезапуск не требуется). #29414 (Raúl Marín).
  • Добавлена настройка use_skip_indexes. #29405 (Maksim Kita).
  • Добавлена поддержка FREEZE для заморозки частей в памяти (для резервного копирования). #29376 (Mo Xuan).
  • Передача исходного query_id в clickhouse-benchmark (ранее, если вы запускали удалённый запрос через clickhouse-benchmark, запросы на сегментах не связывались с исходным запросом через initial_query_id). #29364 (Azat Khuzhin).
  • Индексы пропуска данных tokenbf_v1 и ngrambf_v1: добавлена поддержка типа данных Array с ключом типа String или FixedString. #29280 (Maksim Kita). Индексы пропуска данных tokenbf_v1 и ngrambf_v1: добавлена поддержка типа данных Map с ключом типа String или FixedString. Автор: @lingtaolf. #29220 (Maksim Kita).
  • Для функции has добавлена поддержка типа данных Map. #29267 (Maksim Kita).
  • Добавлены настройки compress_logs для clickhouse-keeper, позволяющие сжимать журналы clickhouse-keeper (для реплицируемой машины состояний) в ZSTD. Реализовано: #26977. #29223 (alesapin).
  • Добавлена настройка external_table_strict_query — она принудительно передаёт всё выражение WHERE в запросах к внешним базам данных, даже если оно несовместимо. #29206 (Azat Khuzhin).
  • Отключены проекции при использовании ARRAY JOIN. В предыдущих версиях анализ проекций мог нарушать работу псевдонимов в ARRAY JOIN. #29139 (Amos Bird).
  • Расширена поддержка большего числа типов в формате ввода/вывода MsgPack. #29077 (Kruglov Pavel).
  • Добавлена поддержка ввода и вывода столбцов LowCardinality в формате ORC. #29062 (Kruglov Pavel).
  • Запрос SELECT к system.distributed_ddl_queue мог показывать некорректные значения; это исправлено. #29061 (tavplubix).
  • Корректная обработка неизвестных методов в HTTP-соединении. Решает #29050. #29057 (Filatenkov Artur).
  • clickhouse-keeper: Исправлена ошибка в clickhouse-keeper-converter, которая могла приводить к потере части данных при восстановлении из журналов ZooKeeper (а не из снимка). #29030 (小路). Исправлена ошибка в clickhouse-keeper-converter, которая могла приводить к некорректной десериализации журнала ZooKeeper. #29071 (小路).
  • Применять настройки из запросов CREATE ... AS SELECT (исправление: #28810). #28962 (Azat Khuzhin).
  • Учитывается настройка базы данных по умолчанию в ALTER TABLE … ON CLUSTER … REPLACE/MOVE PARTITION FROM/TO … #28955 (anneji-dev).
  • Протокол gRPC: добавлена возможность изменять с клиента сжатие на стороне сервера. #28953 (Vitaly Baranov).
  • Игнорировать исключение “no data” при чтении термодатчиков для асинхронных метрик. Это закрывает #28852. #28882 (alexey-milovidov).
  • Исправлена логическая ошибка, связанная с состоянием гонки, которая в редких случаях могла вызывать ошибку Dictionary not found для существующего словаря. #28853 (tavplubix).
  • Смягчена проверка вложенных функций для комбинатора If (но вложенные одинаковые комбинаторы по-прежнему запрещены). #28828 (Azat Khuzhin).
  • Исправлено возможное неперехваченное исключение при завершении работы сервера. #28761 (Azat Khuzhin).
  • Запретить очистку каталогов tmp, которые могут использоваться активной операцией mutation/merge, если такая mutation/merge длится необычно долго. #28760 (Azat Khuzhin).
  • Разрешена оптимизация optimize_arithmetic_operations_in_aggregate_functions = 1 при использовании алиаса. #28746 (Amos Bird).
  • Реализована настройка detach_not_byte_identical_parts для ReplicatedMergeTree, которая будет отсоединять, а не удалять части, не идентичные на уровне байтов (после merge/mutate). #28708 (Azat Khuzhin).
  • Добавлена настройка max_suspicious_broken_parts_bytes для MergeTree (чтобы ограничить суммарный размер всех повреждённых частей; значение по умолчанию — 1GiB). #28707 (Azat Khuzhin).
  • Добавлена поддержка разворачивания макросов в настройках таблицы RabbitMQ. #28683 (Vitaly Baranov).
  • Вернули возможность читать данные таблицы на движке Log в несколько потоков. #28125 (Vitaly Baranov).
  • Исправлена некорректная обработка столбца NULL в JSON-функциях. Это исправление устраняет проблему #27930. #28012 (Amos Bird).
  • Появилась возможность задавать размер кэша Mark/Uncompressed для индексов пропуска данных отдельно от столбцов. #27961 (Amos Bird).
  • Разрешено использовать JOIN с USING вместе с другими типами JOIN. #23881 (darkkeks).
  • Обновлён подмодуль aws-sdk для поддержки троттлинга в Yandex Cloud S3. #30646 (ianton-ru).
  • Исправлено освобождение идентификаторов запроса и сеанса в конце обработки запроса при обработке вызова gRPC. #29954 (Vitaly Baranov).
  • Исправлено завершение работы AccessControlManager, чтобы устранить нестабильность теста. #29951 (Vitaly Baranov).
  • Исправлено падение на failed assertion при чтении из HDFS. Библиотека libhdfs3 обновлена, чтобы её можно было использовать в тестах в режиме отладки. Закрывает #29251. Закрывает #27814. #29276 (Kseniia Sumarokova).

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

  • Добавлена поддержка сборок FreeBSD для машин Aarch64. #29952 (MikaelUrankar).
  • Для ClickHouse больше не нужны рекурсивные подмодули. #30315 (alexey-milovidov).
  • ClickHouse теперь можно собирать статически с Musl. Эта возможность добавлена как экспериментальная; сборка odbc-bridge, library-bridge, интеграция с CatBoost и некоторыми библиотеками не поддерживаются. #30248 (alexey-milovidov).
  • Включена поддержка Protobuf, Arrow, ORC, Parquet для сборок AArch64 и Darwin (macOS). Это закрывает #29248. Это закрывает #28018. #30015 (alexey-milovidov).
  • Добавлена кросс-сборка для PowerPC (powerpc64le). Это закрывает #9589. Включена поддержка взаимодействия с MySQL для AArch64 и PowerPC. Это закрывает #26301. #30010 (alexey-milovidov).
  • В toolchain для кросс-компиляции оставлены только необходимые файлы. Они включены как подмодули (раньше загружались как tarball-архивы). #29974 (alexey-milovidov).
  • В ClickHouse реализован подход к фаззингу с учетом структуры для парсера оператора SELECT. #30012 (Paul).
  • Включен экспериментальный вычислитель constexpr-выражений для clang, чтобы ускорить компиляцию шаблонного кода. #29668 (myrrc).
  • Добавлена возможность компиляции с использованием более новой версии glibc без использования новых символов. #29594 (Azat Khuzhin).
  • Уменьшен размер бинарного файла Debug-сборки с помощью опции оптимизации clang. #28736 (flynn).
  • Теперь все образы для CI будут размещаться в отдельном репозитории на Docker Hub. #28656 (alesapin).
  • Улучшена поддержка сборки с clang-13. #28046 (Sergei Semin).
  • Добавлена возможность выводить сырые profile events в clickhouse-client (это может быть полезно для отладки и тестирования). #30064 (Azat Khuzhin).
  • Добавлена зависимость от времени для unit clickhouse-server (в systemd и sysvinit). #28891 (Azat Khuzhin).
  • Кэш stacktrace теперь перезагружается при перезагрузке символа. #28137 (Amos Bird).

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

  • Функции для регистронезависимого поиска в строках UTF-8, такие как positionCaseInsensitiveUTF8 и countSubstringsCaseInsensitiveUTF8, в очень редких случаях могли находить подстроки, которые на самом деле не совпадали; это исправлено. #30663 (tavplubix).
  • Исправлено чтение из пустого файла на зашифрованном диске. #30494 (Vitaly Baranov).
  • Исправлено преобразование цепочки дизъюнкций в IN (управляется настройкой optimize_min_equality_disjunction_chain_length) в distributed queries с настройкой legacy_column_name_of_tuple_literal = 0. #28658 (Anton Popov).
  • Разрешено использовать материализованный столбец в качестве ключа сегментирования в distributed таблице, даже при insert_allow_materialized_columns=0:. #28637 (Vitaly Baranov).
  • Исправлено ORDER BY ... WITH FILL при заданных TO и FROM и отсутствии строк в результирующем наборе. #30888 (Anton Popov).
  • Исправлено: индекс Set не использовался в выражениях AND/OR, когда операндов было больше двух. Это исправляет #30416. #30887 (Amos Bird).
  • Исправлен сбой при материализации проекции с хеш-функцией. Это исправляет #30861. Проблема аналогична https://github.com/ClickHouse/ClickHouse/pull/28560 и связана с некорректным пониманием инварианта пустоты header. #30877 (Amos Bird).
  • Устранена неоднозначность при извлечении имени вспомогательного ZooKeeper из пути ZooKeeper в ReplicatedMergeTree. Ранее сервер мог не запуститься с ошибкой Unknown auxiliary ZooKeeper name, если путь ZooKeeper содержал двоеточие. Исправлено в #29052. Также раньше допускалось указывать путь ZooKeeper, не начинающийся со слеша, но теперь это считается устаревшим, и создавать новые таблицы с таким путём больше нельзя. Слеши и двоеточия в именах вспомогательных ZooKeeper также не допускаются. #30822 (tavplubix).
  • Очистка временного каталога, если localBackup по какой-либо причине завершался с ошибкой. #30797 (ianton-ru).
  • Исправлено состояние гонки между REPLACE/MOVE PARTITION и фоновым слиянием в нереплицируемом MergeTree, из-за которой часть перемещённых/заменённых данных могла оставаться в партиции. Исправляет #29327. #30717 (tavplubix).
  • Исправлена обработка PREWHERE и WHERE в случае, когда PREWHERE всегда истинно. #30668 (Azat Khuzhin).
  • Оптимизация проталкивания LIMIT могла вызывать ошибку Cannot find column. Исправлено в #30438. #30562 (Nikolai Kochetov).
  • Добавлены отсутствующие скобки при преобразовании isNotNull/isNull в IS [NOT] NULL (исправляет запросы с чем-то вроде isNotNull(1)+isNotNull(2)). #30520 (Azat Khuzhin).
  • Устранена взаимная блокировка при ALTER со скалярным подзапросом к той же таблице, закрыт #30461. #30492 (Vladimir C).
  • Исправлен segfault, который мог возникать, если срок действия сеанса истекал во время выполнения REPLACE PARTITION. #30432 (tavplubix).
  • Запросы с условием вида IN (subquery) могли возвращать неверный результат, если использовалась агрегатная проекция. Исправлено создание множеств для проекций. #30310 (Amos Bird).
  • Исправлено разрешение псевдонимов столбцов в запросах JOIN при включенной проекции. Это исправляет #30146. #30293 (Amos Bird).
  • Исправлен один из недостатков функции replaceRegexpAll. #30292 (Memo).
  • Исправлен разбор параметра preallocate в конфигурации структуры для ComplexKeyHashedDictionary и ComplexKeySparseHashedDictionary. #30246 (Maksim Kita).
  • Исправлена функция [I]LIKE. Исправление закрывает #28661. #30244 (Nikolay Degterinsky).
  • Устранён сбой при использовании shortcircuit и lowcardinality в multiIf. #30243 (Raúl Marín).
  • FlatDictionary, HashedDictionary: исправлен расчёт bytes_allocated для атрибутов Nullable. #30238 (Maksim Kita).
  • Разрешены идентификаторы, начинающиеся с цифр, в запросах с несколькими JOIN. #30230 (Vladimir C).
  • Исправлено чтение из MergeTree при max_read_buffer_size = 0 (если пользователь хочет выстрелить себе в ногу) (может приводить к исключениям Can't adjust last granule, LOGICAL_ERROR или даже к потере данных). #30192 (Azat Khuzhin).
  • Исправлена работа pread_fake_async/pread_threadpool при использовании min_bytes_to_use_direct_io. #30191 (Azat Khuzhin).
  • Исправлена ошибка, из-за которой INSERT SELECT некорректно заполнял материализованный столбец на основе Nullable-столбца. #30189 (Azat Khuzhin).
  • Добавлена поддержка аргументов Nullable в функции initializeAggregation. #30177 (Anton Popov).
  • Исправлена ошибка Port is already connected в запросах с GLOBAL IN и WITH TOTALS. Только для версий 21.9 и 21.10. #30086 (Nikolai Kochetov).
  • Исправлено состояние гонки между MOVE PARTITION и операциями слияния/мутациями в MergeTree. #30074 (Azat Khuzhin).
  • Удалённая база данных Memory могла вновь появиться после перезапуска сервера — это исправлено (#29795). Также была добавлена настройка force_remove_data_recursively_on_drop как обходное решение для ошибки Directory not empty при удалении базы данных Ordinary (поскольку в облачной среде невозможно вручную удалить оставшиеся данные). #30054 (tavplubix).
  • Исправлено падение sample при использовании tuple(), закрыт #30004. #30016 (flynn).
  • попытка закрыть проблему: #29965. #29976 (hexiaoting).
  • Исправлено возможное состояние гонки между FileChecker и StorageLog/StorageStripeLog. #29959 (Azat Khuzhin).
  • Исправлена гонка данных между LogSink::writeMarks() и LogSource в StorageLog. #29946 (Azat Khuzhin).
  • Исправлена потенциальная утечка ресурсов, связанная с ограничением числа одновременных запросов для таблиц MergeTree, добавленным в https://github.com/ClickHouse/ClickHouse/pull/19544. #29879 (Amos Bird).
  • Исправлена проверка пересоздания системных таблиц (не выявляла изменения в значениях enum). #29857 (Azat Khuzhin).
  • MaterializedMySQL: Исправлена проблема, из-за которой при потере соединения с MySQL могла обрабатываться лишь часть транзакции. #29837 (Håvard Kvålen).
  • Предотвращена ошибка Timeout exceeded: elapsed 18446744073.709553 seconds, которая в крайне редких случаях могла возникать, предположительно, из-за ошибки в ядре. Исправление #29154. #29811 (tavplubix).
  • Исправлено некорректное приведение типов в запросе ATTACH TABLE ... FROM 'path', когда вместо пути используется нестроковый литерал. Это может приводить к чтению неинициализированной памяти. #29790 (alexey-milovidov).
  • Исправлен одновременный доступ к LowCardinality при GROUP BY (в сочетании с таблицами Buffer это может приводить к проблемам). #29782 (Azat Khuzhin).
  • Исправлена некорректная работа GROUP BY (в результате появлялось несколько строк с одинаковыми ключами) в случае распределённого запроса, когда сегменты имели смешанные версии <= 21.3 и >= 21.4, ключ GROUP BY состоял из нескольких столбцов фиксированного размера и была включена двухуровневая агрегация (см. group_by_two_level_threshold и group_by_two_level_threshold_bytes). Исправляет #29580. #29735 (Nikolai Kochetov).
  • Исправлено некорректное поведение настройки materialized_postgresql_tables_list при перезапуске сервера. Проблема обнаружена в #28529. #29686 (Kseniia Sumarokova).
  • Условие в предикате фильтра могло теряться после push-down-оптимизации. #29625 (Nikolai Kochetov).
  • Исправлены JIT-компиляция выражений с псевдонимами и вычисление выражений с коротким замыканием. Закрывает #29403. #29574 (Maksim Kita).
  • Исправлен редкий segfault в запросе ALTER MODIFY, возникавший при использовании некорректного идентификатора таблицы в DEFAULT-выражении, например x.y.z... Исправление #29184. #29573 (alesapin).
  • Исправлено разыменование nullptr для GROUP BY WITH TOTALS HAVING (если столбец из HAVING не был выбран). #29553 (Azat Khuzhin).
  • Устранены взаимные блокировки при одновременном чтении и записи в таблицах движка Join. #29544 (Raúl Marín).
  • Исправлена ошибка в проверке pathStartsWith, связанная с использованием std::mismatch: Поведение не определено, если второй диапазон короче первого.. #29531 (Kseniia Sumarokova).
  • В мост ODBC добавлены повторные попытки при ошибке Invalid cursor state. Эта ошибка допускает повторные попытки. Закрывает #29473. #29518 (Kseniia Sumarokova).
  • Исправлен некорректный разбор имени таблицы при загрузке базы данных Lazy. Исправлена проблема #29456. #29476 (tavplubix).
  • Исправлено возможное возникновение Block structure mismatch для подзапросов с предикатом HAVING, перенесённым на уровень ниже. Исправляет #29010. #29475 (Nikolai Kochetov).
  • Исправлена логическая ошибка Cannot capture columns в функциях greatest/least. Исправление закрывает #29334. #29454 (Kruglov Pavel).
  • Движок таблицы RocksDB: исправлена гонка при многократном открытии DB (и возвращены некоторые тесты, воспроизводящие эту проблему в CI). #29393 (Azat Khuzhin).
  • Исправлено некорректное завершение работы реплицируемого хранилища доступа при ошибочной конфигурации. #29388 (Kevin Michel).
  • Удалена оконная функция nth_value, так как она небезопасна по потреблению памяти. Закрывает #29347. #29348 (alexey-milovidov).
  • Исправлено вертикальное слияние частей проекций. Это исправляет #29253. В этом PR также исправлено несколько проблем со слиянием/мутацией проекций, появившихся в https://github.com/ClickHouse/ClickHouse/pull/25165. #29337 (Amos Bird).
  • Исправлено зависание DDL-запросов в базе данных Replicated при добавлении новой реплики. #29328 (Kevin Michel).
  • Исправлены тайм-ауты подключения (send_timeout/receive_timeout). #29282 (Azat Khuzhin).
  • Исправлено возможное исключение Table columns structure in ZooKeeper is different from local table structure, возникавшее при пересоздании или создании новых реплик ReplicatedMergeTree, если один из столбцов таблицы имеет выражение по умолчанию с регистронезависимыми функциями. #29266 (Anton Popov).
  • Возвращать клиенту (по TCP) стандартную ошибку Database doesn't exist error (UNKNOWN_DATABASE) вместо Attempt to read after eof (ATTEMPT_TO_READ_AFTER_EOF). #29229 (Azat Khuzhin).
  • Исправлен segfault при вставке в столбец типа LowCardinality(Nullable) в формате входных данных Avro. #29132 (Kruglov Pavel).
  • Не допускайте повторного использования ранее заданных учетных данных при использовании межсерверного секрета (Ранее при INSERT через Buffer/Kafka в distributed таблицу с настроенным для этого кластера межсерверным секретом мог повторно использоваться ранее заданный пользователь для этого соединения). #29060 (Azat Khuzhin).
  • Исправлена обработка any_join_distinct_right_table_keys при JOIN со словарём, закрыт #29007. #29014 (Vladimir C).
  • Исправлена ошибка “Столбец … не найден в блоке” при JOIN по столбцу-алиасу, закрыт #26980. #29008 (Vladimir C).
  • Исправлено число потоков, используемых в подзапросе GLOBAL IN (из-за исправления ошибки #19414 он выполнялся в одном потоке). #28997 (Nikolai Kochetov).
  • Исправлены некорректные оптимизации ORDER BY, если он содержит WITH FILL. Это закрывает #28908. Это закрывает #26049. #28910 (alexey-milovidov).
  • Исправлены ошибки в функциях высшего порядка для работы с массивами при использовании констант (SIGSEGV для arrayCompact/ILLEGAL_COLUMN для arrayDifference/arrayCumSumNonNegative). #28904 (Azat Khuzhin).
  • Исправлена проблема ожидания мутации при mutations_sync=2. #28889 (Azat Khuzhin).
  • Исправлены запросы к внешним базам данных (например, MySQL) с несколькими столбцами в IN (например, (k,v) IN ((1, 2)) ). #28888 (Azat Khuzhin).
  • Исправлена ошибка с LowCardinality при сокращённом вычислении функции. Закрывает #28884. #28887 (Kruglov Pavel).
  • Исправлено чтение подстолбцов из компактных частей. #28873 (Anton Popov).
  • Исправлено состояние гонки между DROP PART и REPLACE/MOVE PARTITION, из-за которого в редких случаях реплики могли расходиться. #28864 (tavplubix).
  • Исправлена компиляция выражений при вычислении с коротким замыканием. #28821 (Azat Khuzhin).
  • Исправлен крайне редкий случай, когда реплики ReplicatedMergeTree могут рассинхронизироваться после жёсткой перезагрузки всех реплик. Ошибка выглядит так: Part ... intersects (previous|next) part .... #28817 (alesapin).
  • Улучшена проверка работоспособности соединения, а также на всякий случай добавлен перехват любых исключений при завершении работы RabbitMQ. #28797 (Kseniia Sumarokova).
  • Исправлено безобидное состояние гонки в ReplicatedMergeTreeQueue. Не должно быть заметно пользователю, но может приводить к трудноуловимым ошибкам. #28734 (alesapin).
  • Исправлен возможный сбой при выполнении SELECT с частично созданной агрегатной проекцией в случае исключения. #28700 (Amos Bird).
  • Исправлен coredump при создании distributed таблиц, если переданы неверные параметры. #28686 (Zhiyong Wang).
  • Добавлены псевдонимы Settings.Names и Settings.Values для таблицы system.processes. #28685 (Vitaly).
  • Поддержка библиотеки S2 Geometry: исправлено число аргументов, требуемых функциями s2RectAdd и s2RectContains. #28663 (Bharat Nallan).
  • Исправлено некорректное преобразование типа константы при использовании первичного ключа с типом Nullable или LowCardinality. #28636 (Amos Bird).
  • Исправлено “Столбец не находится в агрегатной функции и не указан в GROUP BY” при использовании PREWHERE (Исправляет: #28461). #28502 (Azat Khuzhin).

Релиз ClickHouse v21.10, 2021-10-16. Презентация, Видео

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

  • Теперь следующие настройки MergeTree на уровне таблицы: replicated_max_parallel_sends, replicated_max_parallel_sends_for_table, replicated_max_parallel_fetches, replicated_max_parallel_fetches_for_table больше не используются. Они никогда не работали должным образом и были заменены на max_replicated_fetches_network_bandwidth, max_replicated_sends_network_bandwidth и background_fetches_pool_size. #28404 (alesapin).

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

  • Добавлена возможность создавать пользовательские функции (UDF) в виде лямбда-выражений. Синтаксис: CREATE FUNCTION {function_name} as ({parameters}) -> {function core}. Пример: CREATE FUNCTION plus_one as (a) -> a + 1. Авторы: @Realist007. #27796 (Maksim Kita) #23978 (Realist007).
  • Добавлены движок Executable и табличная функция executable. Они позволяют обрабатывать данные с помощью внешних скриптов в режиме стриминга. #28102 (Maksim Kita) (ruct).
  • Добавлен движок ExecutablePool. Аналогичен Executable, но использует пул долгоживущих процессов. #28518 (Maksim Kita).
  • Добавлен запрос ALTER TABLE ... MATERIALIZE COLUMN. #27038 (Vladimir Chebotarev).
  • Добавлена поддержка записи по партициям в табличную функцию s3. #23051 (Vladimir Chebotarev).
  • Добавлена поддержка формата сжатия lz4 (в дополнение к gz, bz2, xz, zstd) для импорта/экспорта данных. #25310 (Bharat Nallan).
  • Разрешены позиционные аргументы при включённой настройке enable_positional_arguments. Закрывает #2592. #27530 (Kseniia Sumarokova).
  • В секции SETTINGS запроса CREATE для таблиц s3 теперь принимаются пользовательские настройки, связанные с форматами файлов. Это закрывает #27580. #28037 (Nikita Mikhaylov).
  • Разрешено SSL-подключение для движка RabbitMQ. #28365 (Kseniia Sumarokova).
  • Добавлена функция getServerPort, позволяющая получать порт сервера. Если порт не используется сервером, генерируется исключение. #27900 (Amos Bird).
  • Добавлены функции преобразования между “Snowflake ID” и DateTime, DateTime64. См. #27058. #27704 (jasine).
  • Добавлена функция SHA512. #27830 (zhanglistar).
  • Добавлена настройка log_queries_probability, позволяющая записывать в query_log только часть запросов. Закрывает #16609. #27527 (Nikolay Degterinsky).

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

  • Добавлен тип дисков web для хранения таблиц только для чтения на веб-сервере в виде статических файлов. См. #23982. #25251 (Kseniia Sumarokova). В основном это нужно для упрощения тестирования работы с общим хранилищем и удобного импорта наборов данных. Не рекомендуется использовать до релиза 21.11.
  • Добавлены новые команды BACKUP и RESTORE. #21945 (Vitaly Baranov). Эта возможность находится в разработке и не предназначена для использования в текущей версии.

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

  • Ускорены агрегатные функции sumIf и countIf. #28272 (Raúl Marín).
  • Создана виртуальная проекция для индексов minmax. Теперь, если включен параметр allow_experimental_projection_optimization, запросы по возможности будут использовать индекс minmax вместо чтения данных. #26286 (Amos Bird).
  • В sequenceMatch и sequenceCount добавлены две проверки, которые позволяют завершать выполнение раньше, если в списке событий отсутствует некоторая детерминированная часть шаблона последовательности. Это изменение позволяет выполнять многие запросы, которые раньше завершались ошибкой из-за достижения лимита операций, и в целом ускоряет конвейер. #27729 (Jakub Kuklis).
  • Улучшен анализ первичного ключа за счет информации о всегда монотонных бинарных функциях, в частности о делении на ненулевую константу. #28302 (Amos Bird).
  • Условие фильтра hasAll теперь может использовать индексы пропуска данных bloom filter. #27984 (Braulio Valdivielso Martínez).
  • Ускорена загрузка частей данных за счет отложенного запуска таблицы. #28313 (Amos Bird).
  • Исправлена возможная проблема с чрезмерным количеством условий, перемещаемых из WHERE в PREWHERE (оптимизация управляется настройкой optimize_move_to_prewhere). #28139 (lthaooo).
  • optimize_distributed_group_by_sharding_key теперь включен по умолчанию. #28105 (Azat Khuzhin).

Улучшение

  • Проверять имя кластера перед созданием Distributed-таблицы; не разрешать создавать таблицу с некорректным именем кластера. Исправляет #27832. #27927 (tavplubix).
  • Добавлена агрегатная функция quantileBFloat16Weighted по аналогии с другими функциями quantile…Weighted. Это закрывает #27745. #27758 (Ivan Novitskiy).
  • Разрешено создание словарей с пустым списком атрибутов. #27905 (Maksim Kita).
  • Добавлена интерактивная документация в clickhouse-client о сбросе пароля. Это полезно в случае, когда пользователь установил ClickHouse, задал пароль и сразу же его забыл. См. #27750. #27903 (alexey-milovidov).
  • Добавлена поддержка случая, когда данные во входном формате JSONAsString заключены в массив. Закрывает #25517. #25633 (Kruglov Pavel).
  • В таблицу system.replicas добавлен новый столбец last_queue_update_exception. #26843 (nvartolomei).
  • Поддержана возможность повторного подключения при отказоустойчивом переключении для таблиц MaterializedPostgreSQL. Закрывает #28529. #28614 (Kseniia Sumarokova).
  • При первом запуске сервера генерируется уникальный UUID сервера. #20089 (Bharat Nallan).
  • Добавлена настройка connection_wait_timeout для движка MySQL (по умолчанию — 5 секунд, 0 — не ждать). #28474 (Azat Khuzhin).
  • Запрещено создание MaterializedPostgreSQL с некорректными аргументами. Закрывает #28423. #28430 (Kseniia Sumarokova).
  • Используйте реальный tmp-файл вместо предопределённого “rows_sources” для Вертикального слияния. Это позволяет избежать создания лишних каталогов на tmp-дисках. #28299 (Amos Bird).
  • Добавлен параметр libhdfs3_conf в конфигурацию сервера вместо экспорта переменной окружения LIBHDFS3_CONF в clickhouse-server.service. Это необходимо для настройки взаимодействия с HDFS. #28268 (Zhichang Yu).
  • Исправлено удаление частей в состоянии Temporary, которое могло приводить к неожиданному исключению (Part %name% doesn't exist). Исправление #23661. #28221 #28221) (Azat Khuzhin).
  • Исправлен zookeeper_log.address (до первого патча в этом PR адрес всегда был ::) и уменьшено число вызовов getpeername(2) для этого столбца (поскольку при каждом добавлении записи в zookeeper_log вызывается getpeername(), этот адрес кэшируется в клиенте ZooKeeper, чтобы этого избежать). #28212 (Azat Khuzhin).
  • Добавлена поддержка неявных преобразований между индексом в операторе [] и ключом типа Map (например, для разных типов Int, String и FixedString). #28096 (Anton Popov).
  • Добавлена поддержка предложения ON CONFLICT при вставке в движок таблицы PostgreSQL или табличную функцию. Закрывает #27727. #28081 (Kseniia Sumarokova).
  • Ослаблены ограничения для типа данных Enum, чтобы можно было подключать совместимые данные. Закрывает #26672. #28028 (Dmitry Novik).
  • Добавлена настройка empty_result_for_aggregation_by_constant_keys_on_empty_set для управления поведением группировки по константным ключам на пустом множестве. Это возвращает прежнее поведение, описанное в #6842. #27932 (Amos Bird).
  • Добавлена настройка replication_wait_for_inactive_replica_timeout. Она позволяет указать, сколько времени ждать, пока неактивные реплики выполнят запрос ALTER/OPTIMZE/TRUNCATE (по умолчанию — 120 секунд). Если replication_alter_partitions_sync равно 2 и некоторые реплики остаются неактивными дольше replication_wait_for_inactive_replica_timeout секунд, будет сгенерировано исключение UNFINISHED. #27931 (tavplubix).
  • Добавлена поддержка лямбда-аргумента для преобразователя столбцов APPLY, позволяющая применять функции более чем с одним аргументом. Это исправление для #27877. #27901 (Amos Bird).
  • По умолчанию включён tcp_keep_alive_timeout. #27882 (Azat Khuzhin).
  • Улучшена отмена удалённого запроса при аварийном завершении работы удалённого сервера. #27881 (Azat Khuzhin).
  • Использовать multipart upload с копированием для больших объектов S3. #27858 (ianton-ru).
  • Разрешён обход символических ссылок в пути к библиотечному словарю. #27815 (Kseniia Sumarokova).
  • Теперь ALTER MODIFY COLUM T в Nullable(T) больше не требует мутации. #27787 (victorgao).
  • Не игнорируйте ошибки и не учитывайте задержки в ReadBufferFromS3 без уведомления. #27484 (Vladimir Chebotarev).
  • Улучшено ALTER ... MATERIALIZE TTL: теперь пересчитываются только метаданные, без фактического выполнения действия TTL. #27019 (lthaooo).
  • Разрешено читать список пользовательских доменов верхнего уровня без символа новой строки в конце файла. #28213 (Azat Khuzhin).

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

  • Исправлены случаи, когда при чтении сжатых данных из carbon-clickhouse возникала ошибка ‘attempt to read after end of file’. Закрывает #26149. #28150 (FArthur-cmd).
  • Исправлена проверка привилегий доступа при выполнении оператора GRANT WITH REPLACE с предложением ON CLUSTER. Этот PR дорабатывает исправление #27001. #27983 (Vitaly Baranov).
  • Теперь можно выполнять выборку с extremes = 1 из столбца типа LowCardinality(UUID). #27918 (Vitaly Baranov).
  • Исправлено приведение типов в стиле PostgreSQL (оператор ::) для отрицательных чисел. #27876 (Anton Popov).
  • После #26864. Исправлено завершение работы NamedSessionStorage: контексты сеансов, хранящиеся в NamedSessionStorage, теперь уничтожаются раньше глобального контекста. #27875 (Vitaly Baranov).
  • Исправлена ошибка в режиме “strict” для windowFunnel. Это устраняет #27469. #27563 (achimbab).
  • Исправлен бесконечный цикл при чтении усечённого архива bzip2. #28543 (Azat Khuzhin).
  • Исправлен конфликт UUID в DROP TABLE во внутреннем DDL от MaterializedMySQL. MaterializedMySQL — экспериментальная возможность. #28533 (Azat Khuzhin).
  • Исправлена ошибка There is no subcolumn, возникавшая при выборке из таблиц, содержащих столбцы Nested и скалярные столбцы с точкой в имени и тем же префиксом, что и у Nested (например, n.id UInt32, n.arr1 Array(UInt64), n.arr2 Array(UInt64)). #28531 (Anton Popov).
  • Исправлена ошибка, которая может приводить к сообщению об ошибке Existing table metadata in ZooKeeper differs in sorting key expression. после выполнения ALTER для ReplicatedVersionedCollapsingMergeTree. Исправляет #28515. #28528 (alesapin).
  • Исправлена возможная утечка наблюдений ZooKeeper (незначительная проблема) при фоновой обработке очереди распределённых DDL-запросов. Закрывает #26036. #28446 (tavplubix).
  • Исправлено отсутствие кавычек вокруг имен таблиц в движке MaterializedPostgreSQL. Закрывает #28316. #28433 (Kseniia Sumarokova).
  • Исправлено некорректное поведение строк, не попавших в JOIN, для столбца Nullable. Закрывает #27691. #28349 (vdimir).
  • Исправлена оптимизация индекса NOT-IN, когда задействованы не все столбцы ключа. Это исправление устраняет проблему #28120. #28315 (Amos Bird).
  • Исправлена проблема с пересекающимися частями, возникавшая из-за того, что новая часть заменялась пустой. #28310 (Azat Khuzhin).
  • Исправлен непоследовательный результат запросов с ORDER BY и таблицами Merge при включенной настройке optimize_read_in_order. #28266 (Anton Popov).
  • Исправлено возможное обращение к неинициализированной памяти в запросах с типом Nullable(LowCardinality) и настройкой extremes, установленной в 1. Исправляет #28165. #28205 (Nikolai Kochetov).
  • Много небольших исправлений в проекциях. Подробное описание см. в PR. #28178 (Amos Bird).
  • Исправлены крайне редкие segfault’ы при завершении работы, вызванные неправильным порядком остановки перезагрузчика контекста/конфигурации. #28088 (nvartolomei).
  • Исправлена обработка значения NULL с типом Nullable(String) в функции JSONExtract. Это исправляет #27929 и #27930. Проблема появилась после изменений в https://github.com/ClickHouse/ClickHouse/pull/25452 . #27939 (Amos Bird).
  • Несколько исправлений для нового инструмента clickhouse-keeper. Исправлена редкая ошибка в clickhouse-keeper, из-за которой клиент мог получить ответ о срабатывании наблюдения раньше, чем ответ на запрос. #28197 (alesapin). Исправлено некорректное поведение в clickhouse-keeper, при котором наблюдения за списком (getChildren) срабатывали на запросы set для дочерних узлов. #28190 (alesapin). Исправлен редкий случай, когда изменения настроек clickhouse-keeper могли приводить к потере журналов и зависанию сервера. #28360 (alesapin). Исправлена ошибка в clickhouse-keeper, которая могла приводить к бесконечной записи в журналы при уменьшении rotate_logs_interval. #28152 (alesapin).

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

  • В стресс-тесте включён Thread Fuzzer. Thread Fuzzer — это возможность ClickHouse, которая позволяет проверять больше вариантов планирования потоков и выявлять больше потенциальных проблем. Это закрывает #9813. Это закрывает #9814. Это закрывает #9515. Это закрывает #9516. #27538 (alexey-milovidov).
  • Добавлен новый уровень логирования test для тестовых окружений. Он ещё подробнее, чем используемый по умолчанию trace. #28559 (alesapin).
  • На этапе конфигурации CMake теперь выводится информация о статусе git. #28047 (Braulio Valdivielso Martínez).
  • Репозиторий apt в Ubuntu временно переключили на зеркало ru.archive.ubuntu.com, так как репозиторий по умолчанию (archive.ubuntu.com) не отвечает из нашего CI. #28016 (Ilya Yatsishin).

Релиз ClickHouse v21.9, 2021-09-09

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

  • Больше не выводятся конечные нули в текстовом представлении типов Decimal. Пример: для decimal с scale 6 будет выводиться 1.23 вместо 1.230000. Это закрывает #15794. Это может внести небольшую несовместимость, если ваши приложения каким-то образом зависели от конечных нулей. Сериализацией в выходных форматах можно управлять с помощью настройки output_format_decimal_trailing_zeros. Реализация toString и приведение к String изменены безусловно. #27680 (alexey-milovidov).
  • Запрещено применять параметрическую агрегатную функцию с комбинатором -Merge к состоянию агрегатной функции, если это состояние было получено агрегатной функцией с другими параметрами. Например, состояние fooState(42)(x) нельзя финализировать с помощью fooMerge(s) или fooMerge(123)(s); параметры должны быть указаны явно, как в fooMerge(42)(s), и должны совпадать. Это не затрагивает некоторые специальные агрегатные функции, такие как quantile и sequence*, которые используют параметры только при финализации. #26847 (tavplubix).
  • В clickhouse-local локальные адреса с портом теперь всегда считаются удалёнными. #26736 (Raúl Marín).
  • Исправлена проблема, из-за которой в некоторых сложных запросах с псевдонимами столбцов, совпадающими с именами выражений, могло происходить некорректное приведение типов. Это исправляет #25447. Это исправляет #26914. Это исправление может привести к обратно несовместимому изменению: если существуют разные выражения с одинаковыми именами, будет сгенерировано исключение. Это может нарушить работу некоторых редких случаев, когда установлено enable_optimize_predicate_expression. #26639 (alexey-milovidov).
  • Теперь scalar subquery всегда возвращает результат типа Nullable, если его тип может быть Nullable. Это необходимо, потому что в случае пустого подзапроса результатом должен быть Null. Ранее можно было получить ошибку о несовместимых типах (при выводе типа scalar subquery не выполняется, и мог использоваться не-Nullable тип). Scalar subquery с пустым результатом, который нельзя преобразовать в Nullable (например, Array или Tuple), теперь вызывает ошибку. Исправляет #25411. #26423 (Nikolai Kochetov).
  • Добавлен синтаксис here document. Пример: SELECT $doc$ VALUE $doc$. #26671 (Maksim Kita). Это изменение обратно несовместимо, если в запросе есть идентификаторы, содержащие $ #28768.
  • Теперь индексы могут работать с типами Nullable, включая isNull и isNotNull. #12433 и #12455 (Amos Bird) и #27250 (Azat Khuzhin). Однако для этого потребовались изменения формата хранения на диске: новый server может читать старые данные, а старый — уже нет. Кроме того, если у вас есть MINMAX индекс пропуска данных, вы можете получить ошибку Data after mutation/merge is not byte-identical, поскольку новый индекс будет иметь расширение .idx2, тогда как раньше использовалось .idx. Поэтому не стоит откладывать обновление всех существующих реплик: иначе, если старая реплика (<21.9) загрузит данные с новой реплики 21.9+, она не сможет применить индекс к загруженной части.

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

  • Реализовано вычисление функций с коротким замыканием, закрывает #12587. Добавлена настройка short_circuit_function_evaluation для управления вычислением функций с коротким замыканием. #23367 (Kruglov Pavel).
  • Добавлена поддержка операторов INTERSECT, EXCEPT, ANY и ALL. #24757 (Kirill Ershov). (Kseniia Sumarokova).
  • Добавлена поддержка шифрования на уровне виртуальной файловой системы (шифрование данных при хранении) с использованием алгоритма AES-CTR. #24206 (Latysheva Alexandra). (Vitaly Baranov) #26733 #26377 #26465.
  • Добавлены функции обработки естественного языка (NLP) для токенизации, стемминга, лемматизации и поиска в расширениях для синонимов. #24997 (Nikolay Degterinsky).
  • Добавлена интеграция с геометрической библиотекой S2. #24980 (Andr0901). (Nikita Mikhaylov).
  • Добавлены движок таблицы SQLite, табличная функция и движок базы данных. #24194 (Arslan Gumerov). (Kseniia Sumarokova).
  • Добавлена поддержка пользовательского запроса для источников словарей MySQL, PostgreSQL, ClickHouse, JDBC, Cassandra. Закрывает #1270. #26995 (Maksim Kita).
  • Добавлено общее (реплицируемое) хранилище пользователей, ролей, политик строк, квот и профилей настроек в ZooKeeper. #27426 (Kevin Michel).
  • Добавлено сжатие для INTO OUTFILE, которое автоматически подбирает алгоритм сжатия. Закрывает #3473. #27134 (Filatenkov Artur).
  • Добавлена возможность INSERT ... FROM INFILE по аналогии с SELECT ... INTO OUTFILE. #27655 (Filatenkov Artur).
  • Добавлен словарь complex_key_range_hashed. Закрывает #22029. #27629 (Maksim Kita).
  • Поддержка выражений в условии JOIN ON. Закрывает #21868. #24420 (Vladimir C).
  • Когда клиент подключается к серверу, он получает информацию обо всех предупреждениях, уже собранных сервером. (Это можно отключить с помощью опции --no-warnings.) Добавлена таблица system.warnings для сбора предупреждений о конфигурации сервера. #26246 (Filatenkov Artur). #26282 (Filatenkov Artur).
  • Разрешено использовать константные выражения из WITH и SELECT в параметрах агрегатных функций. Закрывает #10945. #27531 (abel-cheng).
  • Добавлена функция tupleToNameValuePairs, которая преобразует именованный кортеж в массив пар. #27505 (Braulio Valdivielso Martínez).
  • Добавлена поддержка метода сжатия bzip2 для импорта и экспорта. Закрывает #22428. #27377 (Nikolay Degterinsky).
  • Добавлена функция bitmapSubsetOffsetLimit(bitmap, offset, cardinality_limit). Она создаёт подмножество битмапа, ограниченное значением cardinality_limit и со смещением offset. #27234 (DHBin).
  • Добавлен столбец default_database в таблицу system.users. #27054 (kevin wan).
  • Поддерживаются макросы cluster внутри табличных функций ‘cluster’ и ‘clusterAllReplicas’. #26913 (polyprogrammist).
  • Добавлены новые функции currentRoles(), enabledRoles(), defaultRoles(). #26780 (Vitaly Baranov).
  • Новые функции currentProfiles(), enabledProfiles(), defaultProfiles(). #26714 (Vitaly Baranov).
  • Добавлены функции, возвращающие (initial_)query_id для текущего запроса. Закрывает #23682. #26410 (Alexey Boykov).
  • Добавлена возможность REPLACE GRANT. #26384 (Caspian).
  • У запроса EXPLAIN появился режим EXPLAIN ESTIMATE ..., который показывает информацию о количестве прочитанных строк, меток и частей в таблицах MergeTree. Закрывает #23941. #26131 (fastio).
  • Добавлена таблица system.zookeeper_log. Все действия клиента ZooKeeper записываются в эту таблицу. Реализовано в #25449. #26129 (tavplubix).
  • Репликация zero-copy для ReplicatedMergeTree поверх хранилища HDFS. #25918 (Zhichang Yu).
  • Добавлена поддержка вставки типа Nested в виде массива структур во входных форматах Arrow, ORC и Parquet. #25902 (Kruglov Pavel).
  • Добавлен новый тип данных Date32 (данные хранятся как Int32), поддерживается тот же диапазон дат, что и для DateTime64, поддерживается загрузка parquet date32 в ClickHouse Date32. Добавлена новая функция toDate32, аналогичная toDate. #25774 (LiuNeng).
  • Добавлена возможность задавать базу данных по умолчанию для пользователя. #25268. #25687 (kevin wan).
  • В движок MongoDB добавлен необязательный параметр для передачи параметров строки подключения и поддержки SSL-соединения. Закрывает #21189. Закрывает #21041. #22045 (Omar Bazaraa).

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

  • Добавлен кодек сжатия AES_128_GCM_SIV, который шифрует столбцы вместо их сжатия. #19896 (PHO). Будет переработан, не используйте.
  • MaterializeMySQL переименован в MaterializedMySQL. #26822 (tavplubix).

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

  • Улучшена производительность быстрых запросов при max_execution_time = 0 за счёт сокращения числа системных вызовов clock_gettime. #27325 (filimonov).
  • Оптимизировано сравнение значений, связанных с дата-время, для повышения производительности. Это исправляет #27083. #27122 (Amos Bird).
  • Реализовано совместное использование файловых дескрипторов при параллельном чтении одних и тех же файлов. В Linux заметной разницы в производительности нет. Но на типичных серверах число открытых файлов будет значительно меньше (в 10..100 раз), что упрощает выполнение операций. См. #26214. #26768 (alexey-milovidov).
  • Снижена задержка коротких запросов, требующих чтения из таблиц с большим количеством столбцов. #26371 (Anton Popov).
  • Убрано построение множеств для индексов при анализе запроса. #26365 (Raúl Marín).
  • Векторизовано вычисление SUM для целочисленных типов Nullable с нативным представлением (David Manzanares, Raúl Marín). #26248 (Raúl Marín).
  • Реализована компиляция выражений, включающих столбцы типа Enum. #26237 (Maksim Kita).
  • Реализована компиляция агрегатных функций groupBitOr, groupBitAnd, groupBitXor. #26161 (Maksim Kita).
  • Улучшено использование памяти благодаря более точному прогнозированию размера блока при чтении пустых DEFAULT-столбцов. Закрывает #17317. #25917 (Vladimir Chebotarev).
  • Снижено использование памяти и количество читаемых строк в запросах с ORDER BY primary_key. #25721 (Anton Popov).
  • distributed_push_down_limit теперь включён по умолчанию. #27104 (Azat Khuzhin).
  • Для toTimeZone обеспечена монотонность, когда timeZone является константным значением, чтобы поддержать отсечение партиций при использовании SQL-запросов вида:. #26261 (huangzhaowei).

Улучшение

  • Перевести оконные функции в статус общедоступных. Удалить настройку allow_experimental_window_functions. #27184 (Alexander Kuzmenkov).
  • Улучшена совместимость со смещениями часовых поясов, выраженными не в целых минутах. #27080 (Raúl Marín).
  • Если файловый дескриптор в таблице File — обычный файл, разрешить читать из него несколько раз. Это позволяет clickhouse-local многократно читать из stdin (при нескольких SELECT-запросах или подзапросах), если stdin является обычным файлом, например: clickhouse-local --query "SELECT * FROM table UNION ALL SELECT * FROM table" ... < file. Это закрывает #11124. В соавторстве с (alexey-milovidov). #25960 (BoloniniD).
  • Устранено дублирование при анализе индексов и исключены возможные некорректные проверки LIMIT при анализе проекций. #27742 (Amos Bird).
  • Добавлена возможность передавать параметры запроса в теле HTTP-запросов. #27706 (Hermano Lustosa).
  • Запретить использование arrayJoin в выражениях партиции. #27648 (Raúl Marín).
  • Логировать IP-адрес клиента при неудачной аутентификации. #27514 (Misko Lee).
  • Использовать байты вместо строк для двоичных данных в протоколе gRPC. #27431 (Vitaly Baranov).
  • Отправляется ответ с сообщением об ошибке, если HTTP-порт не задан, а пользователь пытается отправить HTTP-запрос на TCP-порт. #27385 (Braulio Valdivielso Martínez).
  • Добавлена функция _CAST для внутреннего использования, которая не сохраняет Nullable у типа, тогда как обычное приведение сохраняет его в соответствии с настройкой cast_keep_nullable. Закрывает #12636. #27382 (Kseniia Sumarokova).
  • Добавлена настройка log_formatted_queries, которая записывает дополнительный форматированный запрос в system.query_log. Это полезно для анализа нормализованных запросов, поскольку такие функции, как normalizeQuery и normalizeQueryKeepNames, не разбирают и не форматируют запросы ради более высокой производительности. #27380 (Amos Bird).
  • Добавлены две настройки max_hyperscan_regexp_length и max_hyperscan_regexp_total_length, чтобы предотвратить использование слишком больших регулярных выражений в функциях, связанных с hyperscan, таких как multiMatchAny. #27378 (Amos Bird).
  • Память, потребляемая битмап-агрегатными функциями, теперь учитывается в ограничениях по памяти. Это закрывает #26555. #27252 (alexey-milovidov).
  • Добавлен 10-секундный кэш для резолвера S3-прокси. #27216 (ianton-ru).
  • Разделили глобальный mutex на отдельные операции построения regexp. Это помогает избежать блокировки других связанных потоков из-за длительного построения regexp. #27211 (Amos Bird).
  • Поддержка схем в движке базы данных PostgreSQL. Закрывает #27166. #27198 (Kseniia Sumarokova).
  • Добавлено отслеживание использования памяти в clickhouse-client. #27191 (Filatenkov Artur).
  • Пытаться записывать query_kind в system.query_log, даже если запрос не удалось запустить. #27182 (Amos Bird).
  • В таблицу system.replicas добавлены столбцы replica_is_active, которые сопоставляют имя реплики с её статусом активности. Закрывает #27138. #27180 (Maksim Kita).
  • Добавлена возможность передавать настройки запроса через URI сервера в веб-интерфейсе. #27177 (kolsys).
  • Добавлена новая метрика MaxPushedDDLEntryID — максимальный идентификатор DDL-записи, которую текущий узел отправляет в ZooKeeper. #27174 (Fuwang Hu).
  • Улучшена проверка условия существования и проверка узла с пустой строкой при создании znode в clickhouse-keeper. #27125 (小路).
  • Merge JOIN корректно обрабатывает пустое множество в правой части. #27078 (Vladimir C).
  • Теперь функции могут быть константами уровня сегмента, то есть, если они выполняются в контексте некоторой distributed таблицы, они генерируют обычный столбец, а в противном случае возвращают константное значение. Среди наиболее примечательных функций: hostName(), tcpPort(), version(), buildId(), uptime(), и т. д. #27020 (Amos Bird).
  • Обновлён extractAllGroupsHorizontal — максимальное количество совпадений в строке теперь можно задать с помощью необязательного третьего аргумента. #26961 (Vasily Nemkov).
  • Статистика RocksDB стала доступна через таблицу system.rocksdb. Опции RocksDB считываются из конфигурации ClickHouse (ключи rocksdb...). ПРИМЕЧАНИЕ: ClickHouse не использует RocksDB как зависимость, это лишь один из дополнительных движков хранения для интеграций. #26821 (Azat Khuzhin).
  • Менее подробные внутренние журналы RocksDB. ПРИМЕЧАНИЕ: ClickHouse не зависит от RocksDB, это лишь один из дополнительных движков хранения для интеграций. Это закрывает #26252. #26789 (alexey-milovidov).
  • Изменение ролей по умолчанию влияет только на новые сеансы. #26759 (Vitaly Baranov).
  • Watchdog по умолчанию отключён в Docker. Исправлена проблема, из-за которой не обрабатывался Ctrl+C. #26757 (Mikhail f. Shiryaev).
  • SET PROFILE теперь также применяет ограничения, если они заданы для указанного профиля. #26730 (Vitaly Baranov).
  • Улучшена обработка команд KILL QUERY. #26675 (Raúl Marín).
  • Функция mapPopulatesSeries теперь поддерживает тип Map. #26663 (Ildus Kurbangaliev).
  • Исправлены чрезмерные (x2) попытки подключения при использовании skip_unavailable_shards. #26658 (Azat Khuzhin).
  • Предотвращено зависание clickhouse-benchmark при сбое соединения (например, из-за EMFILE). #26656 (Azat Khuzhin).
  • Разрешено движку Kafka использовать больше потоков. #26642 (feihengye).
  • Добавлена поддержка round-robin для clickhouse-benchmark (она не отличается от обычного запуска с несколькими хостами/портами, кроме отчёта со статистикой). #26607 (Azat Khuzhin).
  • Исполняемые словари (executable, executable_pool) теперь поддерживают создание через DDL-запрос в clickhouse-local. Закрывает #22355. #26510 (Maksim Kita).
  • Для обработчиков протоколов совместимости mysql и postgresql задан тип клиентского запроса. #26498 (anneji-dev).
  • Для запросов вида SELECT * FROM dist ORDER BY key LIMIT 10 с distributed_push_down_limit=1 LIMIT теперь применяется на сегментах. Для запросов вида SELECT DISTINCT shading_key FROM dist ORDER BY key выполнение этапов Distinct/LIMIT BY теперь исключается. Теперь distributed_push_down_limit учитывается оптимизацией optimize_distributed_group_by_sharding_key. #26466 (Azat Khuzhin).
  • protobuf обновлён до версии 3.17.3. Список изменений доступен на https://github.com/protocolbuffers/protobuf/releases. #26424 (Ilya Yatsishin).
  • Добавлена настройка use_hedged_requests, позволяющая снизить задержки «длинного хвоста» в крупных кластерах. #26380 (alexey-milovidov).
  • Улучшено поведение, если в списке разрешённых хостов пользователя указан несуществующий хост. #26368 (ianton-ru).
  • Добавлена возможность задавать настройки мониторинга каталога Distributed через CREATE TABLE (то есть CREATE TABLE dist (key Int) Engine=Distributed(cluster, db, table) SETTINGS monitor_batch_inserts=1 и т. п.). #26336 (Azat Khuzhin).
  • Сохранять адрес сервера в URL в истории веб-интерфейса, если он отличается от адреса, с которого открыт веб-интерфейс. Это закрывает #26044. #26322 (alexey-milovidov).
  • В профилирование вызовов sleep / sleepEachRow добавлены события. #26320 (Raúl Marín).
  • Разрешено повторно использовать соединения сегментов в разных кластерах. Это также позволяет избежать создания новых соединений при использовании табличной функции cluster. #26318 (Amos Bird).
  • Добавлен параметр со значением по умолчанию для управления периодичностью очистки старых временных каталогов. #26212. #26313 (fastio).
  • Добавлена настройка function_range_max_elements_in_block для настройки защитного порога объема данных, генерируемого функцией range. Это закрывает #26303. #26305 (alexey-milovidov).
  • Проверять хеш-функцию при создании таблицы, а не при сэмплировании. Добавлена настройка для MergeTree: если кто-то создаёт таблицу с некорректным столбцом сэмплирования, но сэмплирование никогда не используется, эту настройку можно отключить, чтобы запускать сервер без исключения. #26256 (zhaoyu).
  • Добавлена настройка output_format_avro_string_column_pattern, чтобы сохранять указанные столбцы String в формате Avro как строки, а не как байты по умолчанию. Реализовано в #22414. #26245 (Ilya Golshtein).
  • Добавлена информация о размерах столбцов в таблице system.columns для таблиц Log и TinyLog. Закрывает #9001. #26241 (Nikolay Degterinsky).
  • Не генерировать исключение при запросе к таблице system.detached_parts, если используется пользовательская конфигурация дисков и каталог detached отсутствует на некоторых дисках. Это закрывает #26078. #26236 (alexey-milovidov).
  • Добавлена проверка на недетерминированные функции в ключах, включая константные выражения, такие как now(), today(). Это закрывает #25875. Это закрывает #11333. #26235 (alexey-milovidov).
  • преобразование типов данных timestamp и timestamptz в DateTime64 в движке таблицы PostgreSQL. #26234 (jasine).
  • Для проекций применён более агрессивный анализ индекса IN, чтобы можно было выбирать более подходящую проекцию. #26218 (Amos Bird).
  • Ключевое слово GLOBAL удалено из IN, если передаётся скалярная функция. В предыдущих версиях, если пользователь указывал GLOBAL IN f(x), генерировалось исключение. #26217 (Amos Bird).
  • В сообщения об исключениях добавлен идентификатор ошибки (например, BAD_ARGUMENTS). Это закрывает #25862. #26172 (alexey-milovidov).
  • Исправлен некорректный вывод при использовании параметра --progress в clickhouse-local. Полоса прогресса будет очищаться после достижения 100 % — как в clickhouse-client. Закрывает #17484. #26128 (Kseniia Sumarokova).
  • Добавлена настройка merge_selecting_sleep_ms. #26120 (lthaooo).
  • Убрали сложное использование Linux AIO с упреждающим чтением одного блока и заменили его на обычный синхронный ввод-вывод с O_DIRECT. В предыдущих версиях настройка min_bytes_to_use_direct_io могла работать некорректно, если max_threads больше единицы. Чтение с direct IO (которое по умолчанию отключено для запросов и включено по умолчанию для крупных слияний) будет работать менее эффективно. Это закрывает #25997. #26003 (alexey-milovidov).
  • Сброс таблицы Distributed при выполнении запроса REPLACE TABLE. Исправляет #24566 — не заменять (и не создавать) таблицу в запросе [CREATE OR] REPLACE TABLE ... AS SELECT, если вставка в новую таблицу завершается ошибкой. Исправляет #23175. #25895 (tavplubix).
  • Добавляет столбец views в system.query_log, содержащий имена (материализованных или live-)представлений, выполняемых запросом. Добавляет новую таблицу журнала (system.query_views_log), содержащую информацию о каждом представлении, выполненном в ходе запроса. Изменяет выполнение представлений: если при выполнении представления генерируется исключение, любое представление, которое уже начало выполняться, продолжит работу до завершения. Ранее такое поведение использовалось при parallel_view_processing=true, а теперь оно применяется всегда. - Зависимые представления теперь сообщают о прогрессе чтения в контекст. #25714 (Raúl Marín).
  • Освобождение соединений после завершения выполнения распределенных запросов теперь выполняется асинхронно. Добавлена новая настройка сервера max_threads_for_connection_collector, которая задает количество воркеров для фоновой обработки соединений. Если пул заполнен, соединение будет освобождаться синхронно, но немного иначе, чем раньше: оно освобождается после отправки EOS клиенту, запрос будет успешно завершаться сразу после получения достаточного объема данных, а любое исключение будет записываться в журнал, а не передаваться клиенту. Добавлена настройка drain_timeout (по умолчанию 3 секунды). При превышении тайм-аута соединение будет разорвано. #25674 (Amos Bird).
  • Поддержка нескольких включений в конфигурации. Можно включать конфигурации пользователей и удалённых серверов из нескольких источников. Просто добавьте элемент <include /> с атрибутом from_zk, from_env или incl, и он будет заменён соответствующей подстановкой. #24404 (nvartolomei).
  • Исправлена вставка нескольких блоков в distributed таблицу при insert_distributed_one_random_shard = 1. Это второстепенная возможность. Помечено как улучшение. #23140 (Amos Bird).
  • Поддержка ключей и значений LowCardinality и FixedString для типа Map. #21543 (hexiaoting).
  • Добавлена возможность перезагрузки конфигурации локального диска. #19526 (taiyang-li).

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

  • Исправлены две ошибки, которые могут приводить к расхождению реплик. #27808 (tavplubix).
  • Исправлена редкая ошибка в DROP PART, которая могла приводить к ошибке Unexpected merged part intersects drop range. #27807 (alesapin).
  • Предотвращены сбои в некоторых форматах, когда из Kafka приходило сообщение NULL (tombstone). Закрывает #19255. #27794 (filimonov).
  • Исправлена фильтрация столбцов при UNION DISTINCT в подзапросе. Закрывает #27578. #27689 (Kseniia Sumarokova).
  • Исправлено некорректное приведение типов при применении функций вроде arrayHas к массивам LowCardinality от Nullable разных нечисловых типов, таких как DateTime и DateTime64. В предыдущих версиях происходило некорректное приведение типов. В новой версии это будет приводить к исключению. Это закрывает #26330. #27682 (alexey-milovidov).
  • Исправлена табличная функция postgresql, из-за которой соединения не закрывались. Закрывает #26088. #27662 (Kseniia Sumarokova).
  • Исправлен ещё один случай возникновения ошибки Unexpected merged part ... intersecting drop range .... #27656 (tavplubix).
  • Исправлена ошибка со столбцом-алиасом в таблице Distributed. #27652 (Vladimir C).
  • После установки max_memory_usage* в ненулевое значение его было невозможно снова сбросить до 0 (без ограничений). Исправлено. #27638 (tavplubix).
  • Исправлен выход значения времени за нижнюю границу диапазона при его построении из компонентов. Закрывает #27193. #27605 (Vasily Nemkov).
  • Исправлен сбой во время материализации проекции, когда в некоторых частях отсутствуют столбцы. Это исправление для #27512. #27528 (Amos Bird).
  • исправлена метрика BackgroundMessageBrokerSchedulePoolTask; возможно, в её названии была опечатка. #27452 (Ben).
  • Исправлена работа распределённых запросов при нулевом количестве сегментов и агрегации. #27427 (Azat Khuzhin).
  • Совместимость в случаях, когда /proc/meminfo не содержит суффикса KB. #27361 (Mike Kot).
  • Исправлен некорректный результат запроса с безопасностью на уровне строк, PREWHERE и фильтром LowCardinality. Исправляет #27179. #27329 (Nikolai Kochetov).
  • Исправлена некорректная проверка идентификатора партиции для таблиц MergeTree, созданных по старому синтаксису. #27328 (tavplubix).
  • Исправлена работа протокола MySQL при использовании параллельных форматов (CSV / TSV). #27326 (Raúl Marín).
  • Исправлена ошибка Cannot find column для запросов со сэмплированием. Ошибка появилась в #24574. Исправлено в #26522. #27301 (Nikolai Kochetov).
  • Исправлены ошибки вида Expected ColumnLowCardinality, gotUInt8 и Bad cast from type DB::ColumnVector<char8_t> to DB::ColumnLowCardinality, возникавшие в некоторых запросах с LowCardinality в PREWHERE. Что ещё важнее, исправлено отсутствие пробелов в сообщении об ошибке. Исправление #23515. #27298 (Nikolai Kochetov).
  • Исправлена работа distributed_group_by_no_merge = 2 с distributed_push_down_limit = 1 или optimize_distributed_group_by_sharding_key = 1 вместе с LIMIT BY и LIMIT OFFSET. #27249 (Azat Khuzhin). Это настолько редкое сочетание настроек, что им никто не пользуется.
  • Исправлена мутация, зависавшая на некорректных партициях в нереплицированном MergeTree. #27248 (Azat Khuzhin).
  • В случае неоднозначности лямбда-функции отдают предпочтение своим аргументам перед другими псевдонимами или идентификаторами. #27235 (Raúl Marín).
  • Исправлена структура столбцов в merge JOIN, закрыт #27091. #27217 (Vladimir C).
  • В редких случаях таблица system.detached_parts могла содержать некорректную информацию о некоторых частях; это исправлено. Исправлено #27114. #27183 (tavplubix).
  • Исправлено использование неинициализированной памяти в функциях multiSearch* при пустом массиве, закрыт #27169. #27181 (Vladimir C).
  • Исправлена синхронизация в GRPCServer. В этом PR исправлена ошибка #27024. #27064 (Vitaly Baranov).
  • Исправлен разбор конфигураций cache, complex_key_cache, ssd_cache, complex_key_ssd_cache. Опции allow_read_expired_keys, max_update_queue_size, update_queue_push_timeout_milliseconds, query_wait_timeout_milliseconds не разбирались для словарей типов, отличных от cache. #27032 (Maksim Kita).
  • Исправлено возможное накопление мутаций из-за гонки с DROP_RANGE. #27002 (Azat Khuzhin).
  • Теперь в запросах вида ALTER TABLE ... PARTITION ID xxx проверяется корректность идентификатора партиции. Исправлено #25718. #26963 (alesapin).
  • Исправлена ошибка “Unknown column name”, возникавшая в некоторых случаях при нескольких JOIN; закрыт #26899. #26957 (Vladimir C).
  • Исправлено чтение пользовательских TLD (обработка прекращалась при меньшем размере буфера или большем размере файла). #26948 (Azat Khuzhin).
  • Исправлена ошибка Missing columns: 'xxx', возникавшая, когда столбец с DEFAULT ссылался на другой нематериализованный столбец без выражения DEFAULT. Исправляет #26591. #26900 (alesapin).
  • Исправлена загрузка ключей словаря в library-bridge для источника словаря library. #26834 (Kseniia Sumarokova).
  • При применении некоторых комбинаторов параметры aggregate function могли теряться, что приводило к исключениям вида Conversion from AggregateFunction(topKArray, Array(String)) to AggregateFunction(topKArray(10), Array(String)) is not supported. Это исправлено. Исправлены #26196 и #26433. #26814 (tavplubix).
  • Добавлено значение event_time_microseconds для REMOVE_PART в system.part_log. В предыдущих версиях оно не устанавливалось. #26720 (Azat Khuzhin).
  • Не удалять данные при остановке таблицы ReplicatedMergeTree, чтобы избежать рассогласования данных и метаданных. #26716 (nvartolomei).
  • Иногда SET ROLE работал некорректно; этот PR это исправляет. #26707 (Vitaly Baranov).
  • Несколько исправлений, связанных с параллельным форматированием (https://github.com/ClickHouse/ClickHouse/issues/26694). #26703 (Raúl Marín).
  • Исправлено потенциальное разыменование nullptr в оконных функциях. Исправляет #25276. #26668 (Alexander Kuzmenkov).
  • Исправлено преобразование файла истории clickhouse-client (при обновлении с формата трёхлетней версии clickhouse-client), если файл пуст. #26589 (Azat Khuzhin).
  • Исправлены некорректные названия функций groupBitmapAnd/Or/Xor (в некоторых случаях они могли отображаться неправильно). Исправлено. #26557 (Amos Bird).
  • Обновлена проверка команды chown в entrypoint Docker-образа clickhouse-server. Это исправляет ошибку, из-за которой перезапуск пода кластера в Kubernetes завершался сбоем (или происходил тайм-аут). #26545 (Ky Li).
  • Исправлен сбой при завершении работы RabbitMQ, если настройка RabbitMQ не запускалась. Закрывает #26504. #26529 (Kseniia Sumarokova).
  • Исправлены проблемы в запросе CREATE DICTIONARY, если имя словаря или базы данных было заключено в кавычки. Закрывает #26491. #26508 (Maksim Kita).
  • Исправлено некорректное разрешение имён столбцов после переписывания их псевдонимов. Это исправляет #26432. #26475 (Amos Bird).
  • Исправлено падение msan, обнаруженное при фаззинге. Исправление #22517. #26428 (Nikolai Kochetov).
  • Исправлен бесконечный поток блоков, не вошедших в JOIN, при закрытии partial_merge_join #26325. #26374 (Vladimir C).
  • Исправлен возможный сбой при входе в систему под учётной записью удалённого пользователя. В этом PR исправлена проблема #26073. #26363 (Vitaly Baranov).
  • Исправлено optimize_distributed_group_by_sharding_key для нескольких столбцов (приводило к некорректному результату при optimize_skip_unused_shards=1/allow_nondeterministic_optimize_skip_unused_shards=1 и нескольких столбцах в выражении ключа сегментирования). #26353 (Azat Khuzhin).
  • Исправлена редкая ошибка при восстановлении утерянной реплики, которая могла приводить к расхождению реплик. #26321 (tavplubix).
  • Исправлена декомпрессия zstd (для импорта/экспорта во фрейминговом формате zstd, не связанном с данными таблиц) в случае, если в конце внутреннего буфера есть escape-последовательности. Закрывает #26013. #26314 (Kseniia Sumarokova).
  • Исправлена логическая ошибка в JOIN с totals, закрыт #26017. #26250 (Vladimir C).
  • Удалён лишний символ новой строки в столбце thread_name таблицы system.stack_trace. Это исправляет #24124. #26210 (alexey-milovidov).
  • Исправлен потенциальный сбой при использовании более одного выражения untuple. #26179 (alexey-milovidov).
  • Не генерировать исключение в toString для Nullable Enum, если у Enum нет значения для 0, закрывает #25806. #26123 (Vladimir C).
  • Исправлен некорректный sequence_id в пакетах протокола MySQL, которые ClickHouse отправляет при возникновении исключения во время выполнения запроса. Из-за этого клиент MySQL мог сбрасывать соединение с сервером ClickHouse. Исправлено #21184. #26051 (tavplubix).
  • Исправлен случай, когда cutToFirstSignificantSubdomainCustom()/cutToFirstSignificantSubdomainCustomWithWWW()/firstSignificantSubdomainCustom() возвращают некорректный тип для констант, из-за чего optimize_skip_unused_shards не работает:. #26041 (Azat Khuzhin).
  • Исправлено возможное несоответствие заголовка при использовании обычной проекции с prewhere. Это исправляет #26020. #26038 (Amos Bird).
  • Исправлено использование sharding_key из столбца без функции в remote() (раньше select * from remote('127.1', system.one, dummy) приводил к ошибке Unknown column: dummy, there are only columns .). #25824 (Azat Khuzhin).
  • Исправлены ошибки Not found column ... и Missing column ... при выполнении выборки из MaterializeMySQL. Исправлены #23708, #24830, #25794. #25822 (tavplubix).
  • Исправлен optimize_skip_unused_shards_rewrite_in для типов, не являющихся UInt64 (в противном случае в итоге могли выбираться неправильные сегменты или генерироваться исключения Cannot infer type of an empty tuple и Function tuple requires at least one argument). #25798 (Azat Khuzhin).

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

  • Теперь тесты с сохранением состояния и тест без сохранения состояния запускаются в случайных часовых поясах. Исправляет #12439. Чтение String как DateTime и запись DateTime как String в формате Protobuf теперь учитывают часовой пояс. Чтение UInt16 как DateTime в форматах Arrow и Parquet теперь интерпретирует его как Date, а затем преобразует в DateTime с учетом часового пояса DateTime, поскольку в Arrow и Parquet тип Date сериализуется как UInt16. GraphiteMergeTree теперь учитывает часовой пояс при округлении времени. Исправляет #5098. Автор: @alexey-milovidov. #15408 (alesapin).
  • clickhouse-test поддерживает SQL-тесты с шаблонами Jinja2. #26579 (Vladimir C).
  • Добавлена поддержка сборки с clang-13. Это закрывает #27705. #27714 (alexey-milovidov). #27777 (Sergei Semin)
  • Добавлены параметры CMake для сборки с определенным набором инструкций CPU или без него. Это относится к #17469 и #27509. #27508 (alexey-milovidov).
  • Исправлена линковка вспомогательных программ при использовании динамических библиотек. #26958 (Raúl Marín).
  • RocksDB обновлен до ветки master от 2021-07-16. #26411 (alexey-milovidov).

Релиз ClickHouse v21.8, 2021-08-12

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

  • В новой версии для таблиц системных журналов (system.query_log, system.query_thread_log, system.processes, system.opentelemetry_span_log) используется тип данных Map. Эти таблицы будут автоматически созданы с новыми типами данных. Для поддержки старых запросов создаются виртуальные столбцы. Закрыто #18698. #23934, #25773 (hexiaoting, sundy-li, Maksim Kita). Если вы хотите откатиться с версии 21.8 на более старую версию, потребуется вручную очистить системные таблицы журналов. См. /var/lib/clickhouse/data/system/*_log.

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

  • Добавлена поддержка части стандарта SQL/JSON. #24148 (l1tsolaiki, Kseniia Sumarokova).
  • Добавлен сбор общих системных метрик (в system.asynchronous_metrics и system.asynchronous_metric_log) об использовании CPU, диска, памяти, IO, сети, файлов, средней нагрузке, частотах CPU, температурных датчиках, счётчиках EDAC, времени непрерывной работы системы; также добавлены метрики о джиттере планировщика и времени, затраченном на сбор метрик. Это работает в ClickHouse аналогично atop и позволяет получать доступ к данным мониторинга, даже если у вас не установлены дополнительные инструменты. Закрывает #9430. #24416 (alexey-milovidov, Yegor Levankov).
  • Добавлены движок таблицы MaterializedPostgreSQL и движок базы данных. Этот движок базы данных позволяет реплицировать базу данных целиком или любое подмножество её таблиц. #20470 (Kseniia Sumarokova).
  • Добавлены новые функции leftPad(), rightPad(), leftPadUTF8(), rightPadUTF8(). #26075 (Vitaly Baranov).
  • В команду ADD INDEX добавлено ключевое слово FIRST, позволяющее добавлять индекс в начало списка индексов. #25904 (xjewer).
  • Добавлена таблица system.data_skipping_indices, содержащая информацию о существующих индексах пропуска данных. Закрывает #7659. #25693 (Dmitry Novik).
  • Добавлены функции bin/unbin. #25609 (zhaoyu).
  • Добавлена поддержка типов Map, UInt128, Int128, UInt256, Int256 в функциях mapAdd и mapSubtract. #25596 (Ildus Kurbangaliev).
  • Добавлена поддержка выражения DISTINCT ON (columns), закрывает #25404. #25589 (Zijie Lu).
  • Добавлена возможность сбрасывать пользовательскую настройку к значению по умолчанию и удалять её из метаданных таблицы. Это позволяет откатить изменение, не зная значения по умолчанию из системы или конфигурации. Закрывает #14449. #17769 (xjewer).
  • Конвейеры отображаются в виде графов в Web UI, если отправлен запрос EXPLAIN PIPELINE graph = 1. #26067 (alexey-milovidov).

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

  • Добавлена компиляция агрегатных функций. Чтобы включить её, используйте параметр compile_aggregate_expressions. #24789 (Maksim Kita).
  • Снижена задержка коротких запросов, требующих чтения из таблиц с большим числом столбцов. #26371 (Anton Popov).

Улучшения

  • Для таблиц системных журналов (system.query_log, system.query_thread_log, system.processes, system.opentelemetry_span_log) используется тип данных Map. Эти таблицы будут автоматически создаваться с новыми типами данных. Для поддержки старых запросов создаются виртуальные столбцы. Закрывает #18698. #23934, #25773 (hexiaoting, sundy-li, Maksim Kita).
  • Для словаря со сложным ключом, содержащим только один атрибут, теперь можно не оборачивать выражение ключа в tuple для функций dictGet, dictHas. #26130 (Maksim Kita).
  • Реализованы функции bin/hex для состояний AggregateFunction. #26094 (zhaoyu).
  • Добавлена поддержка аргументов типа UUID для функций empty и notEmpty. UUID считается пустым, если состоит только из нулей (nil UUID). Закрывает #3446. #25974 (zhaoyu).
  • Добавлена поддержка SET SQL_SELECT_LIMIT для протокола MySQL. Закрывает #17115. #25972 (Kseniia Sumarokova).
  • Расширено инструментирование сетевого взаимодействия: добавлены Counter для байтов recv/send; добавлены Gauge для recvs/sends. Добавлена недостающая документация. Закрывает #5897. #25962 (alexey-milovidov).
  • Добавлена настройка optimize_move_to_prewhere_if_final. Если запрос содержит FINAL, оптимизация move_to_prewhere будет включаться только в том случае, если включены и optimize_move_to_prewhere, и optimize_move_to_prewhere_if_final. Закрывает #8684. #25940 (Kseniia Sumarokova).
  • Разрешена поддержка сложных идентификаторов JOIN-таблиц в кавычках. Закрывает #17861. #25924 (alexey-milovidov).
  • Добавлена поддержка компонентов с символами Unicode (например, китайскими, кириллическими) в типах данных Nested. Закрывает #25594. #25923 (alexey-milovidov).
  • Добавлена поддержка работы функций quantiles* с aggregate_functions_null_for_empty. Закрывает #25892. #25919 (alexey-milovidov).
  • Разрешено задавать параметры параметрических агрегатных функций в виде произвольных константных выражений (например, 1 + 2), а не только литералов. Также разрешено использовать параметры запроса (в параметризованных запросах, таких как {param:UInt8}) внутри параметрических агрегатных функций. Закрывает #11607. #25910 (alexey-milovidov).
  • Корректно генерировать исключение при попытке разобрать некорректное значение Date. Закрывает #6481. #25909 (alexey-milovidov).
  • Поддержка множественных включений в конфигурации. Можно включать конфигурацию пользователей и конфигурацию удалённого сервера из нескольких источников. Просто добавьте элемент <include /> с атрибутом from_zk, from_env или incl, и он будет заменён соответствующей подстановкой. #24404 (nvartolomei).
  • Поддержка запросов со столбцом с именем "null" (его нужно заключать в обратные кавычки или двойные кавычки) и ON CLUSTER. Закрывает #24035. #25907 (alexey-milovidov).
  • Добавлена поддержка LowCardinality, Decimal и UUID для JSONExtract. Закрывает #24606. #25900 (Kseniia Sumarokova).
  • Файл истории переведён из формата readline в формат replxx. #25888 (Azat Khuzhin).
  • Исправлена проблема, из-за которой после DROP PART или фонового удаления пустой части могут возникать пересекающиеся части. #25884 (alesapin).
  • Улучшена обработка потерянных частей в таблицах ReplicatedMergeTree. Исправлены редкие несоответствия в ReplicationQueue. Исправлена проблема #10368. #25820 (alesapin).
  • Разрешён запуск clickhouse-client, если рабочий каталог недоступен для чтения. #25817 (ianton-ru).
  • Исправлена ошибка “Нет доступных столбцов” в табличном движке Merge. #25801 (Azat Khuzhin).
  • Движок MySQL теперь поддерживает обмен комментариями столбцов между MySQL и ClickHouse. #25795 (Storozhuk Kostiantyn).
  • Исправлено непоследовательное поведение константы GROUP BY для пустого множества. Закрывает #6842. #25786 (Kseniia Sumarokova).
  • Отмена уже выполняющихся слияний в партиции при DROP PARTITION и TRUNCATE для ReplicatedMergeTree. Исправляет #17151. #25684 (tavplubix).
  • Добавлена поддержка типа данных ENUM` в MaterializeMySQL. #25676 (Storozhuk Kostiantyn).
  • Добавлена поддержка материализованных столбцов и столбцов-псевдонимов в JOIN, закрыт #13274. #25634 (Vladimir C).
  • Исправлена возможная логическая гонка между ALTER TABLE ... DETACH и фоновыми слияниями. #25605 (Azat Khuzhin).
  • Метрика NetworkReceiveElapsedMicroseconds теперь корректно включает время, затраченное на ожидание данных от клиента для INSERT. Закрывает #9958. #25602 (alexey-milovidov).
  • Добавлена поддержка TRUNCATE TABLE для S3 и HDFS. Исправление закрывает #25530. #25550 (Kseniia Sumarokova).
  • Поддержка динамической перезагрузки конфигурации для изменения количества потоков в пуле, используемом для выполнения фоновых задач (слияний, мутаций, загрузок). #25548 (Nikita Mikhaylov).
  • Разрешено извлекать нестроковые элементы как строки с помощью JSONExtract. Это сделано для #25414. #25452 (Amos Bird).
  • Поддержка регулярных выражений в аргументе Database для StorageMerge. Закрывает #776. #25064 (flynn).
  • В веб-интерфейсе: если значение выглядит как URL, автоматически создавать ссылку. #25965 (alexey-milovidov).
  • Команда sudo service clickhouse-server start теперь работает в системах с systemd, таких как CentOS 8. Закрывает #14298. Закрывает #17799. #25921 (alexey-milovidov).

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

  • Исправлена некорректная работа SET ROLE в некоторых случаях. #26707 (Vitaly Baranov).
  • Устранено возможное разыменование nullptr в оконных функциях. Исправлена проблема #25276. #26668 (Alexander Kuzmenkov).
  • Исправлены неверные имена функций groupBitmapAnd/Or/Xor. Исправление #26557 (Amos Bird).
  • Исправлен сбой при завершении работы RabbitMQ, если инициализация RabbitMQ не была запущена. Закрывает #26504. #26529 (Kseniia Sumarokova).
  • Исправлены проблемы с запросом CREATE DICTIONARY, если имя словаря или базы данных было заключено в кавычки. Закрывает #26491. #26508 (Maksim Kita).
  • Исправлена ошибка разрешения имён после перезаписи псевдонимов столбцов. Исправление #26432. #26475 (Amos Bird).
  • Исправлен бесконечный поток блоков, не объединённых через JOIN, при завершении partial_merge_join #26325. #26374 (Vladimir C).
  • Исправлен возможный сбой при входе в систему от имени пользователя, который был удалён. Исправление #26073. #26363 (Vitaly Baranov).
  • Исправлено optimize_distributed_group_by_sharding_key для случая с несколькими столбцами (приводило к некорректному результату при optimize_skip_unused_shards=1/allow_nondeterministic_optimize_skip_unused_shards=1 и нескольких столбцах в выражении ключа сегментирования). #26353 (Azat Khuzhin).
  • CAST из Date в DateTime (или DateTime64) не использовал часовой пояс типа DateTime. Это также могло влиять на сравнение Date и DateTime. При выводе общего типа для Date и DateTime соответствующий часовой пояс тоже не использовался. Это влияло на результаты функции if и создание массивов. Закрывает #24128. #24129 (Maksim Kita).
  • Исправлена редкая ошибка при восстановлении потерянной реплики, из-за которой реплики могли расходиться. #26321 (tavplubix).
  • Исправлена распаковка zstd в случае, когда в конце внутреннего буфера находятся escape-последовательности. Закрывает #26013. #26314 (Kseniia Sumarokova).
  • Исправлена логическая ошибка в JOIN с totals, закрыт #26017. #26250 (Vladimir C).
  • Удалён лишний символ новой строки в столбце thread_name таблицы system.stack_trace. Исправлено в #24124. #26210 (alexey-milovidov).
  • Исправлен joinGet для столбцов LowCarinality, закрыт #25993. #26118 (Vladimir C).
  • Исправлен возможный сбой в pointInPolygon, если настройка validate_polygons отключена. #26113 (alexey-milovidov).
  • Исправлена ошибка, из-за которой при итерации по несуществующему удалённому каталогу генерировалось исключение. #26087 (ianton-ru).
  • Исправлен редкий сбой сервера, вызванный abort в клиенте ZooKeeper. Исправление #25813. #26079 (alesapin).
  • Исправлена неверная оценка количества потоков для правого JOIN с подзапросом в некоторых случаях. Закрывает #24075. #26052 (Vladimir C).
  • Исправлен некорректный sequence_id в пакетах протокола MySQL, которые ClickHouse отправляет при возникновении исключения во время выполнения запроса. Это могло приводить к тому, что клиент MySQL сбрасывал соединение с сервером ClickHouse. Исправление #21184. #26051 (tavplubix).
  • Исправлено возможное несовпадение заголовка при использовании обычной проекции с PREWHERE. Исправлена проблема #26020. #26038 (Amos Bird).
  • Исправлено форматирование типа Map с целочисленными ключами в формате JSON. #25982 (Anton Popov).
  • Исправлена возможная взаимная блокировка при разворачивании стека профилировщика запросов. Исправление #25968. #25970 (Maksim Kita).
  • Исправлено падение при вызове dictGet() с неверными аргументами. #25913 (Vitaly Baranov).
  • Исправлена аутентификация scram-sha-256 в движках PostgreSQL. Закрывает #24516. #25906 (Kseniia Sumarokova).
  • Исправлена чрезмерно долгая задержка для фоновых задач, когда фоновый пул переполнен. Исправление #25836. #25893 (alesapin).
  • Исправлена обработка исключений на ARM при нестандартном размере страницы. Исправляет #25512, #25044, #24901, #23183, #20221, #19703, #19028, #18391, #18121, #17994, #12483. #25854 (Maksim Kita).
  • Исправлено использование sharding_key из столбца без функции в remote() (ранее select * from remote('127.1', system.one, dummy) приводил к ошибке Unknown column: dummy, there are only columns .). #25824 (Azat Khuzhin).
  • Исправлены ошибки Not found column ... и Missing column ... при выполнении SELECT из MaterializeMySQL. Исправление #23708, #24830, #25794. #25822 (tavplubix).
  • Исправлено optimize_skip_unused_shards_rewrite_in для типов, отличных от UInt64 (иначе в конечном итоге могли выбираться некорректные сегменты или возникать ошибки Cannot infer type of an empty tuple либо Function tuple requires at least one argument). #25798 (Azat Khuzhin).
  • Исправлена редкая ошибка в запросе DROP PART для таблиц ReplicatedMergeTree, которая могла приводить к появлению сообщения об ошибке Unexpected merged part intersecting drop range. #25783 (alesapin).
  • Исправлена ошибка в TTL с выражением GROUP BY, из-за которой TTL отказывался выполняться после первого выполнения в куске данных. #25743 (alesapin).
  • Разрешен доступ StorageMerge к таблицам с псевдонимами. Закрывает #6051. #25694 (Kseniia Sumarokova).
  • Исправлен медленный dict JOIN в некоторых случаях; закрыто #24209. #25618 (Vladimir C).
  • Исправлено ALTER MODIFY COLUMN для столбцов, участвующих в выражениях TTL. #25554 (Anton Popov).
  • Исправлен assert в PREWHERE для типа, отличного от UInt8; закрыт #19589. #25484 (Vladimir C).
  • Исправлен сбой msan, выявленный фаззингом. Исправление #22517. #26428 (Nikolai Kochetov).
  • Обновлена проверка команды chown в entrypoint-скрипте Docker для clickhouse-server. Это исправляет ошибку ‘не удалось перезапустить под кластера (или произошёл тайм-аут)’ в Kubernetes. #26545 (Ky Li).

Релиз ClickHouse v21.7, 2021-07-09

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

  • Улучшена производительность запросов с явно заданными большими наборами. Добавлена настройка совместимости legacy_column_name_of_tuple_literal. Её имеет смысл установить в true при поэтапном обновлении кластера с версии ниже 21.7 до любой более новой версии. В противном случае во время обновления распределённые запросы с явно заданными наборами в операторе IN могут завершаться ошибкой. #25371 (Anton Popov).
  • Изменение максимального размера буфера в clickhouse-keeper (экспериментальная альтернатива ZooKeeper), несовместимое как с предыдущими, так и с последующими версиями. Лучше сделать это сейчас (до production), чем позже. #25421 (alesapin).

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

  • Добавлена поддержка конфигурации в формате YAML как альтернативы XML. Это закрывает #3607. #21858 (BoloniniD).
  • Добавлена возможность восстановить реплицированную таблицу, если данные (возможно) сохранились, но метаданные ZooKeeper утеряны. Решает #13458. #13652 (Mike Kot).
  • Добавлена поддержка структур и maps в форматах Arrow/Parquet/ORC, а также словарей во входных/выходных форматах Arrow. Представлена новая настройка output_format_arrow_low_cardinality_as_dictionary. #24341 (Kruglov Pavel).
  • Добавлена поддержка типа Array в словарях. #25119 (Maksim Kita).
  • Добавлена функция bitPositionsToArray. Закрывает #23792. Автор: [Kevin Wan] (@MaxWk). #25394 (Maksim Kita).
  • Добавлена функция dateName, возвращающая названия вроде ‘Friday’ или ‘April’. Автор: [Daniil Kondratyev] (@dankondr). #25372 (Maksim Kita).
  • Добавлена функция toJSONString для сериализации столбцов в JSON-представление. #25164 (Amos Bird).
  • Теперь query_log содержит два новых столбца: initial_query_start_time, initial_query_start_time_microsecond, которые записывают время начала распределённого запроса, если такой есть. #25022 (Amos Bird).
  • Добавлена агрегатная функция segmentLengthSum. #24250 (flynn).
  • Добавлена новая булева настройка prefer_global_in_and_join, которая по умолчанию трактует все IN/JOIN как GLOBAL IN/JOIN. #23434 (Amos Bird).
  • Добавлена поддержка запросов ALTER DELETE для таблицы Join. #23260 (foolchi).
  • Добавлена агрегатная функция quantileBFloat16, а также соответствующие quantilesBFloat16 и medianBFloat16. Это очень простой и быстрый оценщик квантилей с относительной ошибкой не более 0.390625%. Это закрывает #16641. #23204 (Ivan Novitskiy).
  • Реализована функция sequenceNextNode(), полезная для анализа потоков. #19766 (achimbab).

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

  • Добавлена поддержка виртуальной файловой системы поверх HDFS. #11058 (overshov) (Kseniia Sumarokova).
  • Теперь clickhouse-keeper (экспериментальная альтернатива ZooKeeper) поддерживает ACL digest, как в ZooKeeper. #24448 (alesapin).

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

  • Добавлена оптимизация, которая заменяет вызовы некоторых функций чтением подстолбцов, чтобы уменьшить объем читаемых данных. Например, оператор col IS NULL преобразуется в чтение подстолбца col.null. Оптимизацию можно включить с помощью настройки optimize_functions_to_subcolumns, которая в настоящее время по умолчанию отключена. #24406 (Anton Popov).
  • Большее число столбцов теперь переписывается в возможные alias-выражения. Это может улучшить оптимизацию, например при использовании проекций. #24405 (Amos Bird).
  • Индекс типа bloom_filter можно использовать для выражений с функцией hasAny и константными массивами. Это закрывает: #24291. #24900 (Vasily Nemkov).
  • Добавлена экспоненциально увеличивающаяся задержка для повторного планирования попытки чтения в случае, если очереди RabbitMQ пусты. (ClickHouse поддерживает импорт данных из RabbitMQ). Закрывает #24340. #24415 (Kseniia Sumarokova).

Улучшение

  • Добавлена возможность ограничивать пропускную способность репликации. Добавлены две настройки Replicated*MergeTree: max_replicated_fetches_network_bandwidth и max_replicated_sends_network_bandwidth, которые позволяют ограничить максимальную скорость загрузки/отправки при репликации для таблицы. Добавлены две общесерверные настройки (в профиле пользователя default): max_replicated_fetches_network_bandwidth_for_server и max_replicated_sends_network_bandwidth_for_server, которые ограничивают максимальную скорость репликации для всех таблиц. Настройки применяются не абсолютно точно. По умолчанию отключено. Исправляет #1821. #24573 (alesapin).
  • Ограничения ресурсов и изоляция для мостов ODBC и Library. Используйте отдельные группу и пользователя clickhouse-bridge для процессов мостов. Установите oom_score_adj так, чтобы мосты становились первыми кандидатами для OOM killer. Установлен максимальный RSS на уровне 1 GiB. Закрывает #23861. #25280 (Kseniia Sumarokova).
  • Добавлена отдельная символическая ссылка clickhouse-keeper на основной бинарный файл clickhouse. Теперь можно запускать службу координации без основного сервера ClickHouse. #24059 (alesapin).
  • Для запроса к VIEW теперь используются глобальные настройки. Исправлено поведение, при котором запросы к VIEW использовали локальные настройки, что приводило к ошибкам, если настройки в CREATE VIEW и SELECT различались. Теперь VIEW не использует эти изменённые настройки, но вы по-прежнему можете передавать дополнительные настройки в разделе SETTINGS запроса CREATE VIEW. Закрывает #20551. #24095 (Vladimir).
  • При запуске сервера части с некорректным ID партиции не удалялись никогда, а всегда переводились в состояние detached. #25070. #25166 (Nikolai Kochetov).
  • Размер фонового пула планировщика увеличен до 128 (настройка background_schedule_pool_size). Это позволяет избежать зависания очереди репликации при медленном соединении с ZooKeeper. #25072 (alesapin).
  • Добавлена настройка MergeTree max_parts_to_merge_at_once, которая ограничивает число частей, которые можно одновременно сливать в фоновом режиме. Не влияет на запрос OPTIMIZE FINAL. Исправляет #1820. #24496 (alesapin).
  • Разрешено использовать оператор NOT IN в отсечении партиций. #24894 (Amos Bird).
  • Считать IPv4-адреса, такие как 127.0.1.1, локальными. Это спорное изменение, и оно закрывает #23504. Michael Filimonov протестирует эту возможность. #24316 (alexey-milovidov).
  • База данных ClickHouse, созданная с помощью MaterializeMySQL (это экспериментальная возможность), теперь содержит все комментарии к столбцам из материализованной базы данных MySQL. #25199 (Storozhuk Kostiantyn).
  • Добавлены настройки (connection_auto_close/connection_max_tries/connection_pool_size) для движка MySQL. #24146 (Azat Khuzhin).
  • Ускорен запуск движка Distributed. #25663 (Azat Khuzhin).
  • Улучшение для Distributed таблиц. Реплики убраны из dirname при internal_replication=true (это позволяет выполнять INSERT в Distributed с cluster при любом количестве реплик; раньше поддерживалось только 15 реплик, а при большем количестве возникала ошибка ENAMETOOLONG при создании каталога для асинхронных блоков). #25513 (Azat Khuzhin).
  • Добавлена поддержка типа Interval в LowCardinality. Это необходимо для промежуточных значений некоторых выражений. Закрывает #21730. #25410 (Vladimir).
  • Добавлен оператор == в условиях по времени для функций sequenceMatch и sequenceCount. Например: sequenceMatch(’(?1)(?t==1)(?2)’)(time, data = 1, data = 2). #25299 (Christophe Kalenzaga).
  • Добавлены настройки http_max_fields, http_max_field_name_size, http_max_field_value_size. #25296 (Ivan).
  • Добавлена поддержка функции if с типами Decimal и Int в её ветвях. Это исправляет #20549. Это исправляет #10142. #25283 (alexey-milovidov).
  • Обновлён текст приглашения в clickhouse-client, а при повторном подключении теперь выводится сообщение. Это закрывает #10577. #25281 (alexey-milovidov).
  • Исправлен учёт памяти в агрегатной функции topK. Закрывает #25259. #25260 (alexey-milovidov).
  • Исправлен topLevelDomain для IDN-хостов (например, example.рф): раньше для таких хостов он возвращал пустую строку. #25103 (Azat Khuzhin).
  • Определять версию ядра Linux во время выполнения (чтобы работал вложенный epoll, необходимый для async_socket_for_remote/use_hedged_requests; иначе удалённые запросы могут зависнуть). #25067 (Azat Khuzhin).
  • Для распределённого запроса, когда optimize_skip_unused_shards=1, разрешён пропуск сегмента при условии вида (ключ сегментирования) IN (one-element-tuple). (Tuple из многих элементов уже поддерживались. Tuple из одного элемента не работал, потому что разбирался как литерал). #24930 (Amos Bird).
  • Улучшены сообщения лога об ошибках S3: при пустых ключах и бакетах больше не появляется двойной пробел. #24897 (Vladimir Chebotarev).
  • Некоторые запросы требуют многопроходного семантического анализа. В этом случае попробуйте повторно использовать готовые множества для IN. #24874 (Amos Bird).
  • Теперь для insert_distributed_sync учитывается max_distributed_connections (иначе на больших кластерах при синхронной вставке может не хватить max_thread_pool_size). #24754 (Azat Khuzhin).
  • Избегайте скрывать ошибки, такие как Limit for rows or bytes to read exceeded, в скалярных подзапросах. #24545 (nvartolomei).
  • Ужесточён парсер преобразования String в Int, чтобы toInt64('+') генерировал исключение. #24475 (Amos Bird).
  • Если SSD_CACHE создаётся с помощью DDL-запроса, его можно создавать только в каталоге user_files. #24466 (Maksim Kita).
  • Поддержка PostgreSQL для указания схемы, отличной от используемой по умолчанию, в запросах вставки. Закрывает #24149. #24413 (Kseniia Sumarokova).
  • Исправлено разрешение IPv6-адресов (то есть исправлен запрос select * from remote('[::1]', system.one)). #24319 (Azat Khuzhin).
  • Исправлены завершающие пробелы в секции FROM с подзапросами в многострочном режиме, а также немного изменён вывод запросов, чтобы сделать его более удобным для восприятия. #24151 (Azat Khuzhin).
  • Улучшение для распределённых таблиц. Добавлена возможность разбивать распределённый батч при сбоях (например, из-за ограничений памяти или повреждений) с помощью distributed_directory_monitor_split_batch_on_failure (по умолчанию выключено). #23864 (Azat Khuzhin).
  • Устранены конфликты имён столбцов в движке таблицы Join. Закрывает #20309. #23769 (Vladimir).
  • Отображение прогресса для движка таблицы File в clickhouse-local и для запроса INSERT в clickhouse-client при передаче данных в stdin. Закрывает #18209. #23656 (Kseniia Sumarokova).
  • Исправления ошибок и улучшения в clickhouse-copier. Теперь можно копировать таблицы с разными (но совместимыми) схемами. Закрывает #9159. Добавлен тест на копирование ReplacingMergeTree. Закрывает #22711. Добавлена поддержка TTL для столбцов и индексов пропуска данных. При создании внутренней distributed таблицы они просто удаляются (в базовой таблице TTL и skipping indices сохраняются). Закрывает #19384. Теперь можно копировать столбцы MATERIALIZED и ALIAS. В некоторых случаях это может быть полезно (например, если этот столбец входит в PRIMARY KEY). Это можно включить, установив свойство allow_to_copy_alias_and_materialized_columns в true в конфигурации задачи. Закрывает #9177. Закрывает [#11007] (https://github.com/ClickHouse/ClickHouse/issues/11007). Закрывает #9514. В конфигурацию задачи добавлено свойство allow_to_drop_target_partitions, чтобы удалять партицию в исходной таблице перед перемещением вспомогательных таблиц. Закрывает #20957. Убрали запрос OPTIMIZE DEDUPLICATE. Этот хак был нужен, потому что ALTER TABLE MOVE PARTITION повторно выполнялся много раз, а обычные таблицы MergeTree не поддерживают дедупликацию. Закрывает #17966. Прогресс теперь записывается в узел ZooKeeper по пути task_path + /status в формате JSON. Закрывает #20955. Добавлена поддержка ReplicatedTables без аргументов. Закрывает #24834 .#23518 (Nikita Mikhaylov).
  • Между повторными попытками чтения из S3 добавлена задержка. #23461 (Vladimir Chebotarev).
  • Параметр insert_allow_materialized_columns (разрешает материализованные столбцы) теперь учитывается при INSERT в таблицу Distributed. #23349 (Azat Khuzhin).
  • Добавлена возможность проталкивать LIMIT в распределённых запросах. #23027 (Azat Khuzhin).
  • Исправлена zero-copy-репликация при использовании нескольких томов S3 (исправление #22679). #22864 (ianton-ru).
  • Определять фактический номер порта, к которому выполнена привязка, если пользователь запрашивает у операционной системы любой свободный порт, и показывать его в сообщении лога. #25569 (bnaecker).
  • Исправлен случай, когда преобразование массивов Postgres иногда приводило к типу данных String вместо n-мерного массива, поскольку attndims в некоторых случаях работает некорректно. Закрывает #24804. #25538 (Kseniia Sumarokova).
  • Исправлено преобразование DateTime с часовым поясом для MySQL, PostgreSQL и ODBC. Закрывает #5057. #25528 (Kseniia Sumarokova).
  • KILL MUTATION для разных таблиц теперь различается (исправляет неожиданную ошибку Cancelled mutating parts). #25025 (Azat Khuzhin).
  • Разрешено объявлять S3-диск в корне бакета (виртуальная файловая система S3 — экспериментальная возможность, находящаяся в разработке). #24898 (Vladimir Chebotarev).
  • Добавлено чтение подстолбцов (например, компонентов Tuple) для distributed таблиц. #24472 (Anton Popov).
  • Добавлена возможность для протокола совместимости с MySQL: функция user теперь возвращает корректный результат. Закрывает #25697. #25697 (sundyli).

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

  • Улучшена обратная совместимость. При использовании в ключе партиционирования теперь используется старая версия функции modulo. Закрывает #23508. #24157 (Kseniia Sumarokova).
  • Исправлена крайне редкая ошибка на серверах с нехваткой памяти, которая могла приводить к невозможности выполнять слияния без перезапуска. Возможно, это также исправляет #24603. #24872 (alesapin).
  • Исправлена крайне редкая ошибка Tagging already tagged part в очереди репликации при одновременном выполнении alter move/replace partition. Возможно, это также исправляет #22142. #24961 (alesapin).
  • Исправлен потенциальный сбой при вычислении состояний агрегатных функций при агрегации состояний агрегатных функций от других агрегатных функций (непрактичный сценарий). См. #24523. #25015 (alexey-milovidov).
  • Исправлена ситуация, при которой запрос SYSTEM RESTART REPLICA или SYSTEM SYNC REPLICA не завершался. Это было обнаружено на сервере с крайне малым объёмом оперативной памяти. #24457 (Nikita Mikhaylov).
  • Исправлена ошибка, которая могла приводить к зависанию клиента ZooKeeper в clickhouse-server. #24721 (alesapin).
  • Если соединение с ZooKeeper было потеряно и после его восстановления реплика была клонирована, в её очереди репликации могли оставаться устаревшие записи. Исправлено аварийное завершение из-за неудачной проверки assert, когда очередь репликации содержит пересекающиеся виртуальные части. В редких случаях это могло происходить при потере части данных. Теперь вместо завершения работы ошибка записывается в журнал. #24777 (tavplubix).
  • Исправлена потеря условия WHERE при оптимизации проталкивания выражений в плане запроса (по умолчанию query_plan_filter_push_down = 1). Исправление #25368. #25370 (Nikolai Kochetov).
  • Исправлена ошибка, которая может приводить к появлению пересекающихся частей после слияний с TTL: Part all_40_40_0 is covered by all_40_40_1 but should be merged into all_40_41_1. This shouldn't happen often.. #25549 (alesapin).
  • При потере соединения с ZooKeeper таблица ReplicatedMergeTree могла ждать завершения фоновых операций, прежде чем пытаться переподключиться. Это исправлено: теперь фоновые операции принудительно останавливаются. #25306 (tavplubix).
  • Исправлена ошибка Key expression contains comparison between inconvertible types в запросах с ARRAY JOIN, если массив используется в первичном ключе. Исправление #8247. #25546 (Anton Popov).
  • Исправлены некорректные итоги для запроса WITH TOTALS и WITH FILL. Исправляет #20872. #25539 (Anton Popov).
  • Исправлена гонка данных при выполнении запроса к system.clusters и одновременной перезагрузке конфигурации кластера. #25737 (Amos Bird).
  • Устранена ошибка No such file or directory при перемещении таблицы Distributed между базами данных. Исправление #24971. #25667 (tavplubix).
  • REPLACE PARTITION в редких случаях мог быть проигнорирован, если исходная партиция была пустой. Это исправлено. Исправление #24869. #25665 (tavplubix).
  • Исправлена ошибка в движке базы данных Replicated, из-за которой в редких случаях какая-либо реплика могла пропускать DDL-запрос, добавленный в очередь. #24805 (tavplubix).
  • Исправлено разыменование нулевого указателя при EXPLAIN AST без запроса. #25631 (Nikolai Kochetov).
  • Исправлено ожидание при автоматическом удалении пустых частей. Это могло приводить к полному заполнению фонового пула и зависанию репликации. #23315 (Anton Popov).
  • Исправлено восстановление таблицы, хранящейся в виртуальной файловой системе S3 (это экспериментальная возможность, не готовая к использованию в рабочей среде). #25601 (ianton-ru).
  • Исправлено разыменование nullptr в формате Arrow при использовании Decimal256. Добавлена поддержка Decimal256 в формате Arrow. #25531 (Kruglov Pavel).
  • Исправлено лишнее подчёркивание перед именами предварительно обработанных файлов конфигурации. #25431 (Vitaly Baranov).
  • Исправление для инструмента clickhouse-copier: устранена ошибка сегментации, возникавшая, когда sharding&#95;key отсутствует в конфигурации задачи copier. #25419 (Nikita Mikhaylov).
  • Исправлен трансформер столбца REPLACE, используемый в DDL: теперь форматированный запрос корректно заключается в кавычки. Это исправляет #23925. #25391 (Amos Bird).
  • Устранена возможность недетерминированного поведения функции quantileDeterministic и подобных ей. Это исправление закрывает #20480. #25313 (alexey-milovidov).
  • Добавлена поддержка SimpleAggregateFunction(LowCardinality) для SummingMergeTree. Исправлена ошибка #25134. #25300 (Nikolai Kochetov).
  • Исправлена логическая ошибка, приводившая к сообщению об исключении “Cannot sum Array/Tuple in min/maxMap”. #25298 (Kruglov Pavel).
  • Исправлена ошибка Bad cast from type DB::ColumnLowCardinality to DB::ColumnVector<char8_t> в запросах, где аргумент LowCardinality использовался для IN (эта ошибка появилась в 21.6). Исправляет #25187. #25290 (Nikolai Kochetov).
  • Исправлено некорректное поведение joinGetOrNull для столбцов без типа Nullable. Это исправляет #24261. #25288 (Amos Bird).
  • Исправлены некорректная работа с большими целыми числами и отчёт UBSan. В предыдущих версиях CAST(1e19 AS UInt128) возвращал ноль. #25279 (alexey-milovidov).
  • Исправлена ошибка, возникавшая при вставке части столбцов в формате CSVWithNames. Исправление #25129. #25169 (Nikita Mikhaylov).
  • Не используйте проекцию таблицы в SELECT с FINAL. Это пока не поддерживается. #25163 (Amos Bird).
  • Исправлена возможная потеря частей после обновления до версии 21.5, если в ключе партиционирования таблицы использовался UUID. (Не рекомендуется использовать UUID в ключе партиционирования). Исправляет #25070. #25127 (Nikolai Kochetov).
  • Исправлено падение при выполнении запроса с CROSS JOIN и joined_subquery_requires_alias = 0. Исправляет #24011. #25082 (Nikolai Kochetov).
  • Исправлена ошибка с константными значениями типа Map в функции mapContains, приводившая к ошибке empty column was returned by function mapContains. Закрывает #25077. #25080 (Kruglov Pavel).
  • Убрана возможность создавать таблицы со столбцами, которые ссылаются сами на себя, например a UInt32 ALIAS a + 1 или b UInt32 MATERIALIZED b. Исправлены #24910, #24292. #25059 (alesapin).
  • Исправлен неверный результат при использовании агрегатной проекции с непустым ключом GROUP BY при выполнении запроса с GROUP BY по пустому ключу. #25055 (Amos Bird).
  • Исправлена сериализация разбитых вложенных сообщений в формате Protobuf. Этот PR устраняет #24647. #25000 (Vitaly Baranov).
  • Исправлены настройки LIMIT/OFFSET для распределённых запросов (на удалённых узлах они игнорируются). #24940 (Azat Khuzhin).
  • Исправлено возможное переполнение буфера в куче в формате Arrow. #24922 (Kruglov Pavel).
  • Исправлена возможная ошибка ‘Cannot read from istream at offset 0’ при чтении файла из DiskS3 (виртуальная файловая система S3 — экспериментальная возможность, которая находится в разработке и не должна использоваться в продакшене). #24885 (Pavel Kovalenko).
  • Исправлено исключение “Отсутствуют столбцы” при JOIN с распределённым materialized view. #24870 (Azat Khuzhin).
  • Разрешена поддержка значений NULL в протоколе совместимости с PostgreSQL. Исправляет #22622. #24857 (Kseniia Sumarokova).
  • Исправлена ошибка, из-за которой клиенту могло быть сгенерировано исключение Mutation was killed при ожидании мутации, если она ещё не была загружена в память. #24809 (alesapin).
  • Исправлена ошибка при десериализации состояния генератора случайных чисел, из-за которой некоторые типы данных, такие как AggregateFunction(groupArraySample(N), T)), могли работать недетерминированно. #24538 (tavplubix).
  • Запретить построение uniqXXXXStates на основе других состояний агрегации. #24523 (Raúl Marín). Затем снова разрешить это, действительно устранив первопричину связанной проблемы. (alexey-milovidov).
  • Исправлено использование кортежей в запросах CREATE .. AS SELECT. #24464 (Anton Popov).
  • Исправлен расчёт общего количества байтов в таблице Buffer. В текущей версии ClickHouse счётчик total_writes.bytes слишком сильно уменьшается при сбросе буфера. Это приводит к переполнению счётчика, и через некоторое время после сброса totalBytes возвращает значение около 17.44 EB. #24450 (DimasKovas).
  • Исправлена некорректная информация о монотонности функции toWeek. Это исправление связано с #24422. Эта ошибка появилась в https://github.com/ClickHouse/ClickHouse/pull/5212, а позже была выявлена более умным механизмом отсечения партиций. #24446 (Amos Bird).
  • При использовании LDAP для аутентификации пользователей. Исправлена потенциальная взаимная блокировка, которая может возникнуть при (пере)сопоставлении ролей LDAP, если группа LDAP сопоставлена с несуществующей локальной ролью. #24431 (Denis Glazachev).
  • В сообщении “multipart/form-data” считайте CRLF, предшествующий границе, её частью. Исправление #23905. #24399 (Ivan).
  • Исправлено удаление партиции при наличии пересекающихся фиктивных частей. В редких случаях могли быть части с версией мутации, превышающей номер текущего блока. #24321 (Amos Bird).
  • Исправлена ошибка при перемещении materialized view из базы данных Ordinary в базу данных Atomic (запрос RENAME TABLE). Теперь внутренняя таблица перемещается в новую базу данных вместе с materialized view. Исправлено #23926. #24309 (tavplubix).
  • Разрешены пустые HTTP-заголовки. Исправлено #23901. #24285 (Ivan).
  • Исправлена обработка мутаций (ALTER UPDATE/DELETE) в таблицах Memory. Закрывает #24274. #24275 (flynn).
  • Свойство LowCardinality столбца в выводе JOIN сделано таким же, как во входных данных; закрыты #23351, #20315. #24061 (Vladimir).
  • Исправление для таблиц Kafka. Исправлена ошибка в поведении аварийного переключения: при Engine = Kafka не удавалось начать чтение, если у того же consumer ранее был пустой assignment. Закрывает #21118. #21267 (filimonov).

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

  • В CI добавлены сборки darwin-aarch64 (Mac M1 / Apple Silicon) #25560 (Ivan), а также ссылки на документацию и сайт (alexey-milovidov).
  • Добавлено кроссплатформенное встраивание бинарных ресурсов в исполняемые файлы. Работает на Illumos. #25146 (bnaecker).
  • В стресс-тесты добавлены параметры, связанные с JOIN, для улучшения фаззинга. #25200 (Vladimir).
  • Включена сборка с модулем S3 на macOS #25217. #25218 (kevin wan).
  • Добавлены случаи интеграционного тестирования для покрытия JDBC bridge. #25047 (Zhichun Wu).
  • В конфигурации интеграционных тестов добавлена специальная обработка для словарей. Удалена оставшаяся ручная настройка словарей. #24728 (Ilya Yatsishin).
  • Добавлены тесты libfuzzer для класса YAMLParser. #24480 (BoloniniD).
  • Для запуска интеграционных тестов теперь используется Ubuntu 20.04, а версия docker-compose обновлена до 1.28.2. Переменные окружения теперь применяются в docker-compose. Переработан test_dictionaries_all_layouts_separate_sources, чтобы обеспечить параллельный запуск. #20393 (Ilya Yatsishin).
  • Исправлена ошибка TOCTOU в скрипте установки. #25277 (alexey-milovidov).

Релиз ClickHouse 21.6, 2021-06-05

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

  • uniqState / uniqHLL12State / uniqCombinedState / uniqCombined64State формируют состояния, несовместимые с типом UUID. #33607.

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

  • Библиотека сжатия zstd обновлена до v1.5.0. При репликации могут появляться сообщения “checksum does not match”. Это ожидаемо из-за обновления алгоритма сжатия, поэтому их можно игнорировать. Эти сообщения носят исключительно информационный характер и не указывают на какое-либо нежелательное поведение.
  • Параметр compile_expressions включен по умолчанию. Хотя он был тщательно протестирован в самых разных сценариях, если вы заметите нежелательное поведение на своих серверах, попробуйте отключить этот параметр.
  • Значения типа UUID нельзя сравнивать с целыми числами. Например, вместо uuid != 0 используйте uuid != '00000000-0000-0000-0000-000000000000'.

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

  • Добавлен оператор приведения в стиле Postgres (::). Например: [1, 2]::Array(UInt8), 0.1::Decimal(4, 4), number::UInt16. #23871 (Anton Popov).
  • Довести поддержку больших целых чисел до промышленной готовности. Добавить поддержку типа данных UInt128. Исправить известные проблемы с типом данных Decimal256. Добавить поддержку больших целых чисел в словарях. Добавить поддержку функций gcd/lcm для больших целых чисел. Добавить поддержку больших целых чисел в функциях поиска по массивам и условных функциях. Добавить поддержку LowCardinality(UUID). Добавить поддержку больших целых чисел в табличной функции generateRandom и в clickhouse-obfuscator. Исправить ошибку при возврате UUID из скалярных подзапросов. Это исправляет #7834. Это исправляет #23936. Это исправляет #4176. Это исправляет #24018. Обратно несовместимое изменение: значения типа UUID нельзя сравнивать с целыми числами. Например, вместо uuid != 0 пишите uuid != '00000000-0000-0000-0000-000000000000'. #23631 (alexey-milovidov).
  • Поддержка типа данных Array для вставки и чтения данных в форматах Arrow, Parquet и ORC. #21770 (taylor12805).
  • Добавлены комментарии к таблицам. Закрывает #23225. #23548 (flynn).
  • Добавлена поддержка создания словарей с помощью DDL-запросов в clickhouse-local. Закрыт #22354. Добавлена поддержка DETACH DICTIONARY PERMANENTLY. Добавлена поддержка EXCHANGE DICTIONARIES для движка базы данных Atomic. Добавлена поддержка перемещения словарей между базами данных с помощью RENAME DICTIONARY. #23436 (Maksim Kita).
  • Добавлена агрегатная функция uniqTheta для поддержки Theta Sketch в ClickHouse. #23894. #22609 (Ping Yu).
  • Добавлена функция splitByRegexp. #24077 (abel-cheng).
  • Добавлена функция arrayProduct, которая принимает массив в качестве аргумента и возвращает произведение всех элементов массива. Закрывает #21613. #23782 (Maksim Kita).
  • В system.stack_trace добавлен столбец thread_name. Это исправляет #23256. #24124 (abel-cheng).
  • Если insert_null_as_default = 1, в запросах INSERT ... SELECT и INSERT ... SELECT ... UNION ALL ... вместо NULL вставляются значения по умолчанию. Закрывает #22832. #23524 (Kseniia Sumarokova).
  • Добавлена поддержка отображения прогресса в clickhouse-local с параметром --progress. #23196 (Egor Savin).
  • Добавлена поддержка HTTP-сжатия (определяемого по HTTP-заголовку Content-Encoding) для источника словаря http. Это исправляет #8912. #23946 (FArthur-cmd).
  • Добавлены SYSTEM QUERY RELOAD MODEL, SYSTEM QUERY RELOAD MODELS. Закрывает #18722. #23182 (Maksim Kita).
  • Добавлена настройка json (логическая, по умолчанию 0) для запроса EXPLAIN PLAN. Когда она включена, результат запроса будет состоять из одной строки JSON. Рекомендуется использовать формат TSVRaw, чтобы избежать лишнего экранирования. #23082 (Nikolai Kochetov).
  • Добавлена настройка indexes (boolean, по умолчанию выключена) в запрос EXPLAIN PIPELINE. При включении отображает используемые индексы, количество отфильтрованных частей и гранул для каждого применённого индекса. Поддерживается для таблиц MergeTree*. #22352 (Nikolai Kochetov).
  • LDAP: реализована функциональность определения user DN для использования при сопоставлении групп Active Directory с ролями ClickHouse. #22228 (Denis Glazachev).
  • Новая агрегатная функция deltaSumTimestamp для суммирования разницы между последовательными строками с сохранением порядка при слиянии благодаря хранению временных меток. #21888 (Russ Frank).
  • Добавлен менее безопасный IMDS-провайдер учетных данных для S3, который корректно работает в Docker. #21852 (Vladimir Chebotarev).
  • Снова добавлена функция indexHint. Это относится к #21238. Это отменяет изменения из #9542. Это исправляет #9540. #21304 (Amos Bird).

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

  • Добавлена поддержка PROJECTION в таблицах MergeTree*. #20202 (Amos Bird).

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

  • Настройка compile_expressions теперь включена по умолчанию. Когда эта настройка включена, композиции простых функций и операторов компилируются в нативный код с помощью LLVM во время выполнения. #8482 (Maksim Kita, alexey-milovidov). Примечание: если возникнут проблемы, отключите эту опцию.
  • Обновлена библиотека re2. Повышена производительность сопоставления по регулярным выражениям. Также этот PR добавляет совместимость с gcc-11. #24196 (Raúl Marín).
  • Входной format ORC теперь читается по stripe, а не через однократную загрузку всей таблицы в память, что снижает расход памяти при больших размерах файлов. #23102 (Chao Ma).
  • Агрегатные функции sum, count и avg в запросе объединяются в одну агрегатную функцию. Эта оптимизация управляется настройкой optimize_fuse_sum_count_avg. Она реализована с помощью новой агрегатной функции sumCount. Эта функция возвращает кортеж из двух полей: sum и count. #21337 (hexiaoting).
  • zstd обновлен до v1.5.0. Производительность сжатия улучшена на несколько процентов. #24135 (Raúl Marín). Примечание: в репликации могут появляться сообщения “checksum does not match”. Это ожидаемо из-за обновления алгоритма сжатия, и такие сообщения можно игнорировать.
  • Улучшена производительность таблиц Buffer: для total_bytes/total_rows в движке Buffer больше не захватывается блокировка. #24066 (Azat Khuzhin).
  • Возвращена поддержка предварительного выделения памяти для словарей hashed/sparse_hashed. #23979 (Azat Khuzhin).
  • async_socket_for_remote теперь включен по умолчанию (меньше потоков при запросах к таблицам Distributed с большим fanout). #23683 (Nikolai Kochetov).

Улучшение

  • В семейство таблиц MergeTree добавлен виртуальный столбец _partition_value. Его можно использовать для детерминированного отсечения партиций. Он нужен для реализации сопоставления партиций для мутаций. #23673 (Amos Bird).
  • Добавлен параметр region для хранилища S3 и диска. #23846 (Vladimir Chebotarev).
  • Добавлена возможность настраивать разные уровни логирования для разных каналов логирования. Закрывает #19569. #23857 (filimonov).
  • Сохранять часовой пояс по умолчанию при операциях с DateTime, если он не указан явно. Например, если добавить одну секунду к значению типа DateTime без часового пояса, оно останется DateTime без часового пояса. В предыдущих версиях значение часового пояса по умолчанию явно указывалось в возвращаемом типе данных, и он становился DateTime(‘something’). Это закрывает #4854. #23392 (alexey-milovidov).
  • Разрешено указывать пустую строку вместо имени базы данных для хранилища MySQL. Для запросов будет использоваться база данных по умолчанию. В предыдущих версиях это работало для запросов SELECT; теперь также добавлена поддержка INSERT. Это закрывает #19281. Это может быть полезно при работе с Sphinx или другими внешними базами данных, совместимыми с MySQL. #23319 (alexey-milovidov).
  • Исправлена функция quantile(s)TDigest. Добавлена специальная обработка singleton-центроидов в соответствии с tdunning/t-digest 3.2+. Также исправлена ошибка, приводившая к чрезмерному сжатию центроидов в реализации более ранней версии алгоритма. #23314 (Vladimir Chebotarev).
  • Функция now64 теперь поддерживает необязательный аргумент timezone. #24091 (Vasily Nemkov).
  • Исправлен случай, когда индикатор прогресса в интерактивном режиме clickhouse-client, появляясь посреди данных, мог перезаписывать часть данных, отображаемых в терминале. Это закрывает #19283. #23050 (alexey-milovidov).
  • Исправлено падение при невозможности выделения памяти в simdjson. https://github.com/simdjson/simdjson/pull/1567 . Помечено как улучшение, поскольку это крайне редкая ошибка. #24147 (Amos Bird).
  • Сохранять словари до завершения работы хранилища (это позволит избежать возможных ошибок external dictionary 'DICT' not found при остановке сервера во время финального сброса данных движком Buffer). #24068 (Azat Khuzhin).
  • Сбрасывать таблицы Buffer перед отключением таблиц (в рамках одной базы данных), чтобы избежать отбрасывания блоков из-за того, что базовая таблица уже была отсоединена (и ошибки Destination table default.a_data_01870 doesn't exist. Block of data is discarded в журнале). #24067 (Azat Khuzhin).
  • Теперь при prefer_column_name_to_alias = 1 предпочтение также будет отдаваться именам столбцов в group by, having и order by. Это исправляет #23882. #24022 (Amos Bird).
  • Добавлена поддержка ORDER BY WITH FILL для DateTime64. #24016 (kevin wan).
  • Добавлена возможность использовать DateTime64 в качестве столбца версии в ReplacingMergeTree. #23992 (kevin wan).
  • Логировать информацию о названии ОС, версии ядра и архитектуре CPU при запуске сервера. #23988 (Azat Khuzhin).
  • Добавлена поддержка указания схемы таблицы для источника данных словаря postgresql. Закрывает #23958. #23980 (Kseniia Sumarokova).
  • Добавлены подсказки по именам элементов Enum (предлагаются варианты в случае опечаток). Закрывает #17112. #23919 (flynn).
  • Измерение found rate (доли случаев, в которых значение было найдено) для Dictionaries (см. found_rate в system.dictionaries). #23916 (Azat Khuzhin).
  • Добавлена возможность задавать специфические настройки очереди через параметр таблицы rabbitmq_queue_settings_list. (Закрывает #23737 и #23918). Пользователь теперь может полностью управлять настройкой RabbitMQ: если параметр таблицы rabbitmq_queue_consume установлен в 1, то движок таблицы RabbitMQ будет подключаться только к указанной очереди и не будет выполнять никакую настройку RabbitMQ на стороне потребителя, такую как объявление exchange, очередей и привязок. (Закрывает #21757). Добавлена корректная очистка при удалении таблицы RabbitMQ — удаляются очереди, объявленные таблицей, а также все привязанные exchanges, если они были созданы этой таблицей. #23887 (Kseniia Sumarokova).
  • Добавлены broken_data_files/broken_data_compressed_bytes в system.distribution_queue. Добавлена метрика количества файлов для асинхронной вставки в Distributed-таблицы, помеченных как повреждённые (BrokenDistributedFilesToInsert). #23885 (Azat Khuzhin).
  • Запрос к system.tables больше не обращается к ZooKeeper. #23793 (Fuwang Hu).
  • Для запросов OPTIMIZE теперь учитывается lock_acquire_timeout_for_background_operations. #23623 (Azat Khuzhin).
  • Возможность изменять настройки диска S3 на лету с помощью новой SQL-команды SYSTEM RESTART DISK. #23429 (Pavel Kovalenko).
  • Если пользователь применил неверную конфигурацию, по ошибке установив max_distributed_connections в ноль, каждый запрос к таблице Distributed будет генерировать исключение с сообщением, содержащим “logical error”. Но на самом деле это ожидаемое поведение, а не logical error, поэтому текст исключения был немного некорректным. Это также запускало проверки в нашем CI-окружении, которые гарантируют, что logical error никогда не возникают. Вместо этого мы будем трактовать max_distributed_connections, ошибочно установленный в ноль, как минимально возможное значение (единица). #23348 (Azat Khuzhin).
  • По умолчанию отключена min_bytes_to_use_mmap_io. #23322 (Azat Khuzhin).
  • Добавлена поддержка LowCardinality, допускающего NULL, с join_use_nulls, закрыт #15101. #23237 (vdimir).
  • Добавлена возможность восстанавливать части MergeTree в каталог detached на диске S3. #23112 (Pavel Kovalenko).
  • Повторные попытки при обрыве HTTP-соединения в S3. #22988 (Vladimir Chebotarev).
  • Добавлены настройки external_storage_max_read_rows и external_storage_max_read_rows для движка таблицы MySQL, источника словаря и небольших загрузок данных в MaterializeMySQL. #22697 (TCeason).
  • MaterializeMySQL (экспериментальная возможность): Ранее MySQL 5.7.9 не поддерживался из-за несовместимости SQL. Теперь проверку параметров MySQL выполняет MaterializeMySQL. #23413 (TCeason).
  • Добавлена возможность чтения подстолбцов в distributed таблицах. #24472 (Anton Popov).
  • Исправлена работа с кортежами в запросах CREATE .. AS SELECT. #24464 (Anton Popov).
  • Поддержка формата Parquet для таблиц Kafka. #23412 (Chao Ma).

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

  • Используется старая версия функции modulo, если она применяется в ключе партиционирования и первичном ключе. Закрывает #23508. #24157 (Kseniia Sumarokova). Это было причиной обратной несовместимости в предыдущих выпусках.
  • Исправлено поведение, при котором запрос SYSTEM RESTART REPLICA или SYSTEM SYNC REPLICA мог обрабатываться бесконечно. Это было выявлено на сервере с крайне малым объёмом оперативной памяти. #24457 (Nikita Mikhaylov).
  • Исправлена некорректная монотонность функции toWeek. Это исправляет проблему #24422. Эта ошибка появилась в #5212, а позже обнаружилась благодаря более умному механизму отсечения партиций. #24446 (Amos Bird).
  • Исправлено удаление партиции при наличии пересекающихся фиктивных частей. В редких случаях могут существовать части с версией мутации, большей, чем номер текущего блока. #24321 (Amos Bird).
  • Исправлена ошибка при перемещении materialized view из базы данных Ordinary в базу данных Atomic (запрос RENAME TABLE). Теперь внутренняя таблица переносится в новую базу данных вместе с materialized view. Исправление #23926. #24309 (tavplubix).
  • Разрешены пустые HTTP-заголовки в запросах клиентов. Исправляет #23901. #24285 (Ivan).
  • Установите max_threads = 1, чтобы исправить сбой мутации в таблицах Memory. Закрывает #24274. #24275 (flynn).
  • Исправлена опечатка в реализации таблиц Memory; эта ошибка появилась в #15127. Закрывает #24192. #24193 (张中南).
  • Исправлено аварийное завершение работы сервера, если HDFS становился недоступен во время выполнения запроса. Закрывает #24117. #24191 (Kseniia Sumarokova).
  • Исправлен сбой при обновлении столбца Nested при константном условии. #24183 (hexiaoting).
  • Исправлено состояние гонки, которое могло возникнуть в RBAC при высокой нагрузке. В этом PR исправлены #24090, #24134,. #24176 (Vitaly Baranov).
  • Исправлена редкая ошибка, из-за которой частично инициализированная table могла обслуживать операции записи (вставка/ALTER и т. д.). Теперь такие table будут работать в режиме только для чтения. #24122 (alesapin).
  • Исправлена ошибка: EXPLAIN PIPELINE с SELECT xxx FINAL показывал неверный конвейер. (hexiaoting).
  • Исправлена работа с константным значением DateTime при сравнении со столбцом DateTime64 в WHERE. #24100 (Vasily Nemkov).
  • Исправлен сбой в merge JOIN, закрыт #24010. #24013 (vdimir).
  • Некоторые запросы ALTER PARTITION могли вызывать ошибки Part A intersects previous part B и Unexpected merged part C intersecting drop range D в очереди репликации. Исправлено. Исправлена проблема #23296. #23997 (tavplubix).
  • Исправлен SIGSEGV для внешнего GROUP BY и строки переполнения (то есть для запросов вида SELECT FROM GROUP BY WITH TOTALS SETTINGS max_bytes_before_external_group_by>0, max_rows_to_group_by>0, group_by_overflow_mode='any', totals_mode='before_having'). #23962 (Azat Khuzhin).
  • Исправлен учёт метрик ключей для словаря CACHE при наличии дубликатов в источнике (это приводило к переполнению DictCacheKeysRequestedMiss). #23929 (Azat Khuzhin).
  • Исправлена реализация пула соединений для движка PostgreSQL. Закрывает #23897. #23909 (Kseniia Sumarokova).
  • Исправлена работа distributed_group_by_no_merge = 2 с GROUP BY и агрегатной функцией, обёрнутой в обычную функцию (ошибка появилась в #23546). Теперь при попытке использовать distributed_group_by_no_merge = 2 с оконными функциями генерируется исключение. Для запросов с оконными функциями отключена optimize_distributed_group_by_sharding_key. #23906 (Azat Khuzhin).
  • Исправлена работа табличной функции s3: улучшена обработка HTTP-ошибок. Ранее тела ответов с HTTP-ошибками игнорировались. #23844 (Vladimir Chebotarev).
  • Исправление для табличной функции s3: улучшена обработка URI. Исправлена несовместимость с URL, содержащими символ +: ранее данные с такими ключами невозможно было прочитать. #23822 (Vladimir Chebotarev).
  • Устранена ошибка Can't initialize pipeline with empty pipe для запросов с GLOBAL IN/JOIN и use_hedged_requests. Исправляет #23431. #23805 (Nikolai Kochetov).
  • Исправлена ошибка, из-за которой CLEAR COLUMN не работает, если на этот столбец ссылается materialized view. Закрывает #23764. #23781 (flynn).
  • Исправлено обращение к освобождённой памяти в куче при чтении из HDFS, если используется формат Values. #23761 (Kseniia Sumarokova).
  • Предотвращена возможная ошибка “Cannot schedule a task” (если ранее возникало какое-либо исключение) при INSERT в Distributed. #23744 (Azat Khuzhin).
  • Исправлена ошибка при восстановлении отставшей реплики ReplicatedMergeTree. Некоторые обновления метаданных могли игнорироваться отставшей репликой, если во время её простоя выполнялся запрос ALTER. #23742 (tavplubix).
  • Исправлена ошибка в JOIN и WITH TOTALS, закрыт #17718. #23549 (vdimir).
  • Исправлена возможная ошибка Block structure mismatch в запросах с UNION, которая могла возникать после оптимизации pushdown фильтров. Исправление #23029. #23359 (Nikolai Kochetov).
  • Добавлено преобразование типов, когда включена настройка optimize_skip_unused_shards_rewrite_in. Это устраняет предупреждение MSan. #23219 (Azat Khuzhin).
  • Добавлена недостающая проверка при обновлении вложенных подстолбцов, закрыта проблема: #22353. #22503 (hexiaoting).

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

  • Добавлена поддержка сборки на Illumos. #24144. Также добавлена поддержка сборки в операционных системах на базе Solaris. #23746 (bnaecker).
  • Добавлено больше бенчмарков для хеш-таблиц, включая Swiss Table от Google (которая в нашем конкретном сценарии использования оказалась медленнее, чем хеш-таблица ClickHouse). #24111 (Maksim Kita).
  • librdkafka обновлена с 1.6.0-RC3 до 1.6.1. #23874 (filimonov).
  • asynchronous-unwind-tables теперь всегда включается явно. Это может исправить профилировщик запросов на AArch64. #23602 (alexey-milovidov).
  • Устранена возможная зависимость сборки от локали и порядка файловой системы. Это позволяет получать воспроизводимые сборки. #23600 (alexey-milovidov).
  • Устранён один из источников недетерминированности при сборке. Теперь сборки, выполненные в разное время, будут давать побайтно идентичные бинарные файлы. Частично решает #22113. #23559 (alexey-milovidov).
  • Добавлен простой инструмент для бенчмаркинга (Zoo)Keeper. #23038 (alesapin).

Релиз ClickHouse 21.5, 2021-05-20

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

  • Изменено сравнение целых чисел и чисел с плавающей точкой в случаях, когда целое число не может быть точно представлено типом данных с плавающей точкой. В новой версии такое сравнение будет возвращать false, поскольку возникает ошибка округления. Например: 9223372036854775808.0 != 9223372036854775808, потому что число 9223372036854775808 нельзя точно представить как число с плавающей точкой (а 9223372036854775808.0 округляется до 9223372036854776000.0). В предыдущей версии сравнение, напротив, показывало, что числа равны, потому что при обратном преобразовании числа с плавающей точкой 9223372036854776000.0 в UInt64 получается 9223372036854775808. Для справки: язык программирования Python тоже считает эти числа равными. Однако это поведение зависело от модели CPU (для некоторых чисел вне диапазона результаты различались на AMD64 и AArch64), поэтому мы сделали сравнение более точным. Теперь целые числа и числа с плавающей точкой считаются равными только в том случае, если целое число точно представимо в типе с плавающей точкой. #22595 (alexey-milovidov).
  • Удалена поддержка argMin и argMax для одного аргумента Tuple. Код не был безопасен с точки зрения работы с памятью. Эта возможность была добавлена по ошибке и вводила пользователей в заблуждение. В будущем эти функции могут вернуть под другими именами. Это исправляет #22384 и отменяет #17359. #23393 (alexey-milovidov).

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

  • Добавлены функции dictGetChildren(dictionary, key), dictGetDescendants(dictionary, key, level). Функция dictGetChildren возвращает все дочерние элементы в виде массива индексов. Это обратное преобразование для dictGetHierarchy. Функция dictGetDescendants возвращает всех потомков так, как если бы dictGetChildren рекурсивно применялась level раз. Значение level, равное нулю, эквивалентно бесконечности. Улучшена производительность функций dictGetHierarchy, dictIsIn. Закрывает #14656. #22096 (Maksim Kita).
  • Добавлена функция dictGetOrNull. Она работает как dictGet, но возвращает Null, если ключ не найден в словаре. Закрывает #22375. #22413 (Maksim Kita).
  • Добавлена табличная функция s3Cluster, которая позволяет параллельно обрабатывать файлы из s3 на каждом узле указанного кластера. #22012 (Nikita Mikhaylov).
  • Добавлена поддержка реплик и сегментов в движке таблицы / табличной функции MySQL/PostgreSQL. Можно написать SELECT * FROM mysql('host{1,2}-{1|2}', ...). Закрывает #20969. #22217 (Kseniia Sumarokova).
  • Добавлен запрос ALTER TABLE ... FETCH PART .... Он похож на FETCH PARTITION, но загружает только одну часть. #22706 (turbo jason).
  • Добавлена настройка max_distributed_depth, которая ограничивает глубину рекурсивных запросов к таблицам Distributed. Закрывает #20229. #21942 (flynn).

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

  • Повышена производительность intDiv за счёт динамической диспетчеризации для AVX2. Закрывает #22314. #23000 (alexey-milovidov).
  • Повышена производительность чтения из входного формата ArrowStream для источников, отличных от локальных файлов (например, URL). #22673 (nvartolomei).
  • По умолчанию отключено сжатие при взаимодействии с localhost (через clickhouse-client или между серверами при распределённых запросах) по собственному протоколу. Это может повысить производительность некоторых операций импорта/экспорта. Закрывает #22234. #22237 (alexey-milovidov).
  • Из правой части секции IN для распределённых запросов исключаются значения, не принадлежащие сегменту (при optimize_skip_unused_shards_rewrite_in, включённом по умолчанию, так как по-прежнему требуется optimize_skip_unused_shards). #21511 (Azat Khuzhin).
  • Повышена производительность чтения подмножества столбцов из таблиц с движком File-подобного типа и столбцово-ориентированным форматом, таким как Parquet, Arrow или ORC. Закрывает #issue:20129. #21302 (keenwolf).
  • Теперь можно переносить больше условий в PREWHERE, как это было до версии 21.1 (скорректированы внутренние эвристики). Недостаточное количество перенесённых условий могло приводить к снижению производительности. #23397 (Anton Popov).
  • Повышена производительность ODBC-соединений и исправлены все оставшиеся проблемы из бэклога. Используется библиотека nanodbc вместо Poco::ODBC. Закрывает #9678. Добавлена поддержка DateTime64 и Decimal* для движка таблицы ODBC. Закрывает #21961. Исправлена проблема с обрезанием кириллического текста. Закрывает #16246. Добавлены пулы соединений для моста ODBC. #21972 (Kseniia Sumarokova).

Улучшения

  • Значение max_uri_size (максимальный размер URL в HTTP-интерфейсе) по умолчанию увеличено до 1 MiB. Это закрывает #21197. #22997 (alexey-milovidov).
  • Установите background_fetches_pool_size в значение 8 — это лучше подходит для использования в рабочей среде при частых небольших вставках или медленном кластере ZooKeeper. #22945 (alexey-milovidov).
  • В FlatDictionary добавлены параметры initial_array_size и max_array_size. #22521 (Maksim Kita).
  • Добавлена новая настройка non_replicated_deduplication_window для дедупликации вставок в нереплицируемых таблицах MergeTree. #22514 (alesapin).
  • Обновлены пути к файлам конфигурации модели CatBoost при перечитывании конфигурации. #22434 (Kruglov Pavel).
  • Добавлена поддержка типа Decimal256 в словарях. Decimal256 — экспериментальная возможность. Закрывает #20979. #22960 (Maksim Kita).
  • Параметр async_socket_for_remote теперь включен по умолчанию (для распределенных запросов используется меньше потоков ОС). #23683 (Nikolai Kochetov).
  • Исправлен quantile(s)TDigest. Добавлена специальная обработка одиночных центроидов в соответствии с tdunning/t-digest 3.2+. Также исправлена ошибка, из-за которой в реализации более ранней версии алгоритма происходило чрезмерное сжатие центроидов. #23314 (Vladimir Chebotarev).
  • Имя функции unhex сделано регистронезависимым для совместимости с MySQL. #23229 (alexey-milovidov).
  • Реализованы функции arrayHasAny, arrayHasAll, has, indexOf, countEqual для общего случая, когда типы элементов массива различаются. В предыдущих версиях функции arrayHasAny и arrayHasAll возвращали false, а has, indexOf и countEqual генерировали исключение. Также добавлена поддержка Decimal и типов больших целых чисел в функции has и аналогичных ей. Это закрывает #20272. #23044 (alexey-milovidov).
  • Увеличен порог максимального количества совпадений в результате работы функции extractAllGroupsHorizontal. #23036 (Vasily Nemkov).
  • Не применять optimize_skip_unused_shards для кластера из одного узла. #22999 (Azat Khuzhin).
  • Добавлена возможность запускать clickhouse-keeper (экспериментальная замена ZooKeeper, совместимая без доработок) с SSL. Настройку конфигурации keeper_server.tcp_port_secure можно использовать для защищенного взаимодействия между клиентом и keeper-server. keeper_server.raft_configuration.secure можно использовать для включения защищенной внутренней связи между узлами. #22992 (alesapin).
  • Добавлена возможность сбрасывать буфер только в фоновом режиме для таблиц Buffer. #22986 (Azat Khuzhin).
  • При выборке из таблицы MergeTree с NULL в условии WHERE в редких случаях возникало исключение. Это закрывает #20019. #22978 (alexey-milovidov).
  • Исправлена обработка ошибок в HTTP-клиенте Poco для AWS. #22973 (kreuzerkrieg).
  • Соблюдается значение max_part_removal_threads для ReplicatedMergeTree. #22971 (Azat Khuzhin).
  • Исправлен редкий пограничный случай для настроек MergeTree inactive_parts_to_throw_insert = 0 при inactive_parts_to_delay_insert > 0. #22947 (Azat Khuzhin).
  • dateDiff теперь поддерживает аргументы DateTime64 (даже для значений за пределами диапазона DateTime) #22931 (Vasily Nemkov).
  • MaterializeMySQL (экспериментальная возможность): добавлена возможность реплицировать базы данных MySQL, содержащие представления, без ошибок. Для этого представления просто игнорируются. #22760 (Christian).
  • Добавлена поддержка политики строк RBAC через протокол PostgreSQL. Закрывает #22658. Протокол PostgreSQL по умолчанию включен в конфигурации. #22755 (Kseniia Sumarokova).
  • Добавлена метрика, показывающая, сколько времени занимает ожидание блокировки слоя Buffer. #22725 (Azat Khuzhin).
  • Разрешена возможность использования CTE в определении VIEW. Это исправляет #22491. #22657 (Amos Bird).
  • Очистить остальную часть экрана и показать курсор в clickhouse-client, если предыдущая программа оставила мусор в терминале. Закрывает #16518. #22634 (alexey-milovidov).
  • Функция round теперь ведёт себя одинаково на платформах, отличных от x86_64. Используется округление до ближайшего чётного при значении, равном половине (банковское округление). #22582 (alexey-milovidov).
  • Исправлена проверка структуры блоков данных, отправляемых таблицами Distributed. #22325 (Azat Khuzhin).
  • Разрешена публикация ошибок Kafka в виртуальный столбец движка Kafka, управляемый настройкой kafka_handle_error_mode. #21850 (fastio).
  • Добавлены псевдонимы simpleJSONExtract/simpleJSONHas к visitParam/visitParamExtract{UInt, Int, Bool, Float, Raw, String}. Исправляет #21383. #21519 (fastio).
  • Добавлен clickhouse-library-bridge для библиотечного источника словаря. Закрывает #9502. #21509 (Kseniia Sumarokova).
  • Запрещено удалять столбец, если на него есть ссылка из materialized view. Закрывает #21164. #21303 (flynn).
  • Поддержка динамических межсерверных учетных данных (ротация учетных данных без простоев). #14113 (johnskopis).
  • Добавлена поддержка хранилища Kafka для сообщений в форматах Arrow и ArrowStream. #23415 (Chao Ma).
  • Исправлено отсутствие точки с запятой в сообщении об исключении. Пользователю это сообщение об исключении может показаться неприятным для чтения. #23208 (alexey-milovidov).
  • Исправлено отсутствие пробелов в некоторых сообщениях об исключениях, связанных с типом LowCardinality. #23207 (alexey-milovidov).
  • Некоторые значения в ячейках таблицы в формате Markdown выравнивались по центру. Теперь нет. #23096 (alexey-milovidov).
  • Убраны несущественные детали из подсказок в clickhouse-client. Это закрывает #22158. #23040 (alexey-milovidov).
  • Исправлен расчёт поля bytes_allocated в system.dictionaries для словарей sparse_hashed. #22867 (Azat Khuzhin).
  • Исправлен приблизительный подсчёт общего количества строк при чтении из MergeTree в обратном порядке. #22726 (Azat Khuzhin).
  • Исправлен случай, когда можно было настроить словарь с источником ClickHouse, ссылающимся на самого себя, что приводило к бесконечному циклу. Закрывает #14314. #22479 (Maksim Kita).

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

  • Несколько исправлений, связанных с hedged requests. Исправлена ошибка Can't initialize pipeline with empty pipe для запросов с GLOBAL IN/JOIN, когда включена настройка use_hedged_requests. Исправление #23431. #23805 (Nikolai Kochetov). Исправлено состояние гонки в hedged connections, приводившее к сбою. Это исправляет #22161. #22443 (Kruglov Pavel). Исправлен возможный сбой в случае получения unknown packet от удалённого запроса (при включенной настройке async_socket_for_remote). Исправление #21167. #23309 (Nikolai Kochetov).
  • Исправлено поведение, при котором при отключении настройки input_format_with_names_use_header все входные данные в формате CSVWithNames отбрасывались. Это исправление устраняет проблему #22406. #23202 (Nikita Mikhaylov).
  • Исправлена проблема с тайм-аутом подключения к удалённому JDBC-мосту. Закрывает #9609. #23771 (Maksim Kita, alexey-milovidov).
  • Исправлена логика начальной загрузки complex_key_hashed, если указан update_field. Закрывает #23800. #23824 (Maksim Kita).
  • Исправлен сбой, возникавший при одновременном применении PREWHERE и фильтра политики строк в случае пустого результата. #23763 (Amos Bird).
  • Устранена возможная ошибка “Cannot schedule a task” при INSERT в Distributed (если до этого возникало исключение). #23744 (Azat Khuzhin).
  • Добавлено исключение для случая, когда в обеих выборках значения полностью совпадают, в агрегатной функции mannWhitneyUTest. Это исправляет #23646. #23654 (Nikita Mikhaylov).
  • Исправлен сбой сервера при вставке данных через HTTP, из-за которого возникало исключение. Это исправляет #23512. #23643 (Nikita Mikhaylov).
  • Исправлена некорректная интерпретация некоторых выражений LIKE с escape-последовательностями. #23610 (alexey-milovidov).
  • Исправлено зависание при выполнении команд restart / stop. Закрывает #20214. #23552 (filimonov).
  • Исправлен сопоставитель COLUMNS для случая с несколькими JOIN в SELECT-запросе. Закрывает #22736. #23501 (Maksim Kita).
  • Исправлен сбой при изменении значения по умолчанию для столбца, если сам столбец используется в качестве параметра ReplacingMergeTree. #23483 (hexiaoting).
  • Исправлены пограничные случаи в Вертикальном слиянии с ReplacingMergeTree. В редких случаях они могли приводить к сбоям слияний с исключениями вида Incomplete granules are not allowed while blocks are granules size. #23459 (Anton Popov).
  • Исправлена ошибка, из-за которой нельзя было привести литерал пустого массива к массиву с размерностью больше 1, например CAST([] AS Array(Array(String))). Закрывает #14476. #23456 (Maksim Kita).
  • Исправлена ошибка, из-за которой агрегатная функция deltaSum возвращала некорректный результат после сброса счётчика. #23437 (Russ Frank).
  • Исправлена ошибка Cannot unlink file, возникавшая при неудачном создании таблицы ReplicatedMergeTree с многодисковой конфигурацией. Это закрывает #21755. #23433 (tavplubix).
  • Исправлена генерация некорректных константных выражений при отсечении партиций по виртуальным столбцам. Это исправляет https://github.com/ClickHouse/ClickHouse/pull/21401#discussion&#95;r611888913. #23366 (Amos Bird).
  • Исправлен сбой при значении настройки join_algorithm ‘auto’ и выполнении JOIN со словарём. Закрывает #23002. #23312 (Vladimir).
  • Не ослабляйте условия NOT при отсечении партиций. Это исправляет #23305 и #21539. #23310 (Amos Bird).
  • Исправлено очень редкое состояние гонки при фоновой очистке старых блоков. Из-за него блок мог не дедуплицироваться, если находился слишком близко к концу окна дедупликации. #23301 (tavplubix).
  • Исправлено крайне редкое (distributed) состояние гонки между созданием и удалением таблиц ReplicatedMergeTree. Оно могло вызывать исключения вида node doesn't exist при попытке создать реплицированную таблицу. Исправление #21419. #23294 (tavplubix).
  • Исправлено создание словаря с простым ключом из DDL, если первичный ключ не является первым атрибутом. Исправляет #23236. #23262 (Maksim Kita).
  • Исправлено чтение через ODBC в таблицах с большим количеством длинных имён столбцов. Закрывает #8853. #23215 (Kseniia Sumarokova).
  • MaterializeMySQL (экспериментальная возможность): исправлена ошибка Not found column при выполнении выборки из MaterializeMySQL с условием по ключевому столбцу. Исправление #22432. #23200 (tavplubix).
  • Исправлена обработка псевдонимов, если подзапрос был сведен к константе. Исправляет #22924. Исправляет #10401. #23191 (Maksim Kita).
  • Сервер мог не запускаться, если в профиле по умолчанию была включена настройка data_type_default_nullable; ошибка исправлена. Исправляет #22573. #23185 (tavplubix).
  • Исправлен сбой при завершении работы, возникавший из-за неправильного учёта текущих соединений. #23154 (Vitaly Baranov).
  • Исправлена ошибка Table .inner_id... doesn't exist при выборке из materialized view после её отсоединения от базы данных Atomic и повторного присоединения. #23047 (tavplubix).
  • Исправлена ошибка Cannot find column in ActionsDAG result, которая может возникнуть, если в подзапросе используется untuple. Исправление #22290. #22991 (Nikolai Kochetov).
  • Исправлено использование константных столбцов типа Map со значениями, допускающими NULL. #22939 (Anton Popov).
  • исправлены formatDateTime() для DateTime64 и спецификатор формата “%C”, а также исправлена toDateTime64() для больших значений и ненулевого масштаба. #22937 (Vasily Nemkov).
  • Исправлен сбой при использовании mannWhitneyUTest и rankCorr в оконных функциях. Исправление #22728. #22876 (Nikita Mikhaylov).
  • LIVE VIEW (экспериментальная возможность): исправлено возможное зависание при одновременных DROP/CREATE TEMPORARY LIVE VIEW в TemporaryLiveViewCleaner, см.. #22858 (Vitaly Baranov).
  • Исправлен pushdown для HAVING в случае, если столбец фильтра используется в агрегации. #22763 (Anton Popov).
  • Исправлены возможные зависания в запросах к Zookeeper при возникновении исключения OOM. Исправлено #22438. #22684 (Nikolai Kochetov).
  • Исправлено ожидание завершения мутаций на нескольких репликах для движков таблиц ReplicatedMergeTree. Ранее запрос ALTER или мутация могли завершаться до того, как мутация фактически выполнялась на других репликах. #22669 (alesapin).
  • Исправлено исключение для Log с вложенными типами без столбцов в секции SELECT. #22654 (Azat Khuzhin).
  • Исправлено бесконечное ожидание вспомогательных AWS-запросов. #22594 (Vladimir Chebotarev).
  • Исправлен сбой, возникавший, когда клиент закрывал соединение слишком рано #22579. #22591 (nvartolomei).
  • Тип данных Map (экспериментальная возможность): исправлено некорректное форматирование функции map в распределённых запросах. #22588 (foolchi).
  • Исправлена десериализация пустой строки без символа новой строки в конце данных в формате TSV. Это закрывает #20244. Возможный обходной путь без обновления версии: установить input_format_null_as_default в ноль. В старых версиях это значение было равно нулю. #22527 (alexey-milovidov).
  • Исправлено неверное приведение столбца типа LowCardinality в алгоритме Merge JOIN. Закрывает #22386, закрывает #22388. #22510 (Vladimir).
  • Было возможно переполнение буфера (при чтении) в полнотекстовом индексе tokenbf_v1. Лишние байты не используются, но в редких случаях операция чтения может приводить к сбою. Это закрывает #19233. #22421 (alexey-milovidov).
  • Не ограничивать размер HTTP-фрагмента. Исправлено #21907. #22322 (Ivan).
  • Исправлена ошибка, которая приводила к неполной агрегации данных при включенном optimize_aggregation_in_order и большом количестве частей в таблице. Также немного улучшена производительность агрегации при включенном optimize_aggregation_in_order. #21889 (Anton Popov).
  • Проверка использования табличной функции view в качестве столбца. Это дополняет #20350. #21465 (Amos Bird).
  • Исправлена ошибка “неизвестный столбец” для таблиц с движком Merge в запросах с JOIN и агрегацией. Закрывает #18368 и #22226. #21370 (Vladimir).
  • Исправлены конфликты имен при оптимизации pushdown. Это приводило к некорректной фильтрации WHERE после FULL JOIN. Закрывает #20497. #20622 (Vladimir).
  • Исправлена очень редкая ошибка, из-за которой вставка с кворумом при quorum_parallel=1 на самом деле не была “кворумной” из-за дедупликации. #18215 (filimonov — сообщил, alesapin — исправил).

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

  • Запуск тестов без сохранения состояния в CI распараллелен. #22300 (alesapin).
  • Упрощены Debian-пакеты. Это исправляет #21698. #22976 (alexey-milovidov).
  • Добавлена поддержка сборки ClickHouse на Apple M1. #21639 (changvvb).
  • Исправлена сборка ClickHouse Keeper для macOS. #22860 (alesapin).
  • Исправлены некоторые тесты для платформы AArch64. #22596 (alexey-milovidov).
  • Добавлено выравнивание функций для возможного повышения производительности. #21431 (Danila Kutenin).
  • Скорректированы некоторые тесты, чтобы они выдавали одинаковые результаты на amd64 и aarch64 (qemu). Результат зависел от специфики реализации поведения CPU. #22590 (alexey-milovidov).
  • Профилирование запросов разрешено только на x86_64. См. #15174 и #15638. Это закрывает #15638. #22580 (alexey-milovidov).
  • Разрешена сборка с внешней xz (lzma) с использованием параметра CMake USE_INTERNAL_XZ_LIBRARY=OFF. #22571 (Kfir Itzhak).
  • Включён встроенный openldap на ppc64le #22487 (Kfir Itzhak).
  • Отключены несовместимые библиотеки (обычно платформозависимые) на ppc64le #22475 (Kfir Itzhak).
  • В CI добавлен тест Jepsen для ClickHouse Keeper. #22373 (alesapin).
  • jemalloc теперь собирается с поддержкой профилирования кучи. #22834 (nvartolomei).
  • Устранено UB в движках *Log, связанное с разблокировкой rwlock из другого потока. #22583 (Azat Khuzhin).
  • Исправлено UB: rwlock в TinyLog теперь разблокируется из того же потока. #22560 (Azat Khuzhin).

Релиз ClickHouse 21.4

Релиз ClickHouse 21.4.1 2021-04-12

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

  • toStartOfIntervalFunction теперь выравнивает часовые интервалы по полуночи (в предыдущих версиях они выравнивались по началу эпохи Unix). Например, toStartOfInterval(x, INTERVAL 11 HOUR) будет разбивать каждый день на три интервала: 00:00:00..10:59:59, 11:00:00..21:59:59 и 22:00:00..23:59:59. Такое поведение лучше соответствует практическим потребностям. Закрывает #9510. #22060 (alexey-milovidov).
  • Age и Precision в конфигурациях graphite rollup должны увеличиваться от одного retention к другому. Теперь это проверяется, и некорректная конфигурация вызывает исключение. #21496 (Mikhail f. Shiryaev).
  • Исправлена ошибка, из-за которой cutToFirstSignificantSubdomainCustom()/firstSignificantSubdomainCustom() возвращали неверный результат для доменов с 3+ уровнями, присутствующих в пользовательском списке доменов верхнего уровня. Для входных доменов, соответствующих этим пользовательским доменам верхнего уровня, домен третьего уровня считался первым значимым. Теперь это исправлено. Это изменение может привести к несовместимости, если функция используется, например, в ключе сегментирования. #21946 (Azat Khuzhin).
  • Столбец keys в таблице system.dictionaries был заменён столбцами key.names и key.types. Для столбцов key.names, key.types, attribute.names, attribute.types из таблицы system.dictionaries не требуется загрузка словаря. #21884 (Maksim Kita).
  • Теперь реплики, обрабатывающие команду ALTER TABLE ATTACH PART[ITION], сначала ищут данные в своих каталогах detached/, а уже потом получают их от других реплик. В качестве детали реализации в реплицируемом журнале введена новая команда ATTACH_PART. Части ищутся и сравниваются по их контрольным суммам. #18978 (Mike Kot). Примечание:
    • Запросы ATTACH PART[ITION] могут не работать во время обновления кластера.
    • Невозможно откатиться на более старую версию ClickHouse после выполнения запроса ALTER ... ATTACH в новой версии, так как старые серверы не смогут обработать запись ATTACH_PART в реплицируемом журнале.
  • В этой версии пустой <remote_url_allow_hosts></remote_url_allow_hosts> будет блокировать весь доступ к удалённым хостам, тогда как в предыдущих версиях он ничего не делал. Если вы хотите сохранить прежнее поведение и у вас есть пустой элемент remote_url_allow_hosts в файле конфигурации, удалите его. #20058 (Vladimir Chebotarev).

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

  • Расширен диапазон DateTime64: теперь поддерживаются даты с 1925 по 2283 год. Улучшена поддержка DateTime вблизи нулевой даты (1970-01-01). #9404 (alexey-milovidov, Vasily Nemkov). Не все функции даты и времени работают в расширенном диапазоне дат.
  • Добавлена поддержка аутентификации Kerberos для преднастроенных пользователей и HTTP-запросов (GSS-SPNEGO). #14995 (Denis Glazachev).
  • Добавлена настройка prefer_column_name_to_alias, позволяющая использовать исходные имена столбцов вместо псевдонимов. Она нужна для лучшей совместимости с распространёнными правилами использования псевдонимов в базах данных. Это связано с #9715 и #9887. #22044 (Amos Bird).
  • Добавлены функции dictGetChildren(dictionary, key), dictGetDescendants(dictionary, key, level). Функция dictGetChildren возвращает все дочерние элементы в виде массива индексов. Это преобразование, обратное dictGetHierarchy. Функция dictGetDescendants возвращает всех потомков так, как если бы dictGetChildren рекурсивно применялась level раз. Нулевое значение level эквивалентно бесконечности. Закрывает #14656. #22096 (Maksim Kita).
  • Добавлен источник словаря executable_pool. Закрывает #14528. #21321 (Maksim Kita).
  • Добавлена табличная функция dictionary. Она работает так же, как и движок Dictionary. Закрывает #21560. #21910 (Maksim Kita).
  • Добавлена поддержка типа Nullable для атрибута PolygonDictionary. #21890 (Maksim Kita).
  • Функции dictGet, dictHas используют имя текущей базы данных, если для словарей, созданных с помощью DDL, оно не указано. Закрывает #21632. #21859 (Maksim Kita).
  • Добавлена функция dictGetOrNull. Она работает как dictGet, но возвращает Null, если ключ не найден в словаре. Закрывает #22375. #22413 (Maksim Kita).
  • Добавлено асинхронное обновление для словарей ComplexKeyCache, SSDCache, SSDComplexKeyCache. Добавлена поддержка типа Nullable в словарях Cache, ComplexKeyCache, SSDCache, SSDComplexKeyCache. Добавлена поддержка выборки нескольких атрибутов с помощью функций dictGet, dictGetOrDefault. Исправлено #21517. #20595 (Maksim Kita).
  • Добавлена поддержка функции dictHas для RangeHashedDictionary. Исправлена проблема #6680. #19816 (Maksim Kita).
  • Добавлена функция timezoneOf, которая возвращает имя часового пояса для типов данных DateTime и DateTime64. Это не закрывает #9959. Исправлены несоответствия в названиях функций: добавлены псевдонимы timezone и timeZone, а также toTimezone и toTimeZone, timezoneOf и timeZoneOf. #22001 (alexey-milovidov).
  • Добавлена новая необязательная секция GRANTEES для команд CREATE/ALTER USER. Она задаёт пользователей или роли, которым этот пользователь может выдавать привилегии, при условии, что ему самому предоставлены все необходимые права доступа с grant option. По умолчанию используется GRANTEES ANY, то есть пользователь с grant option может выдавать привилегии кому угодно. Синтаксис: CREATE USER ... GRANTEES {user | role | ANY | NONE} [,...] [EXCEPT {user | role} [,...]]. #21641 (Vitaly Baranov).
  • Добавлен новый столбец slowdowns_count в system.clusters. При использовании hedged requests он показывает, сколько раз происходило переключение на другую реплику из-за того, что текущая реплика отвечала медленно. Также в system.clusters теперь отображается фактическое значение errors_count. #21480 (Kruglov Pavel).
  • Добавлен виртуальный столбец _partition_id для движков MergeTree*. Добавлена возможность отсекать партиции по _partition_id. Добавлена функция partitionID() для вычисления строкового идентификатора партиции. #21401 (Amos Bird).
  • Добавлена функция isIPAddressInRange для проверки, содержится ли IPv4- или IPv6-адрес в указанном сетевом префиксе CIDR. #21329 (PHO).
  • Добавлена новая SQL-команда ALTER TABLE 'table_name' UNFREEZE [PARTITION 'part_expr'] WITH NAME 'backup_name'. Эта команда нужна для корректного удаления ‘замороженных’ партиций со всех дисков. #21142 (Pavel Kovalenko).
  • Поддерживается неявное преобразование типов ключей для JOIN. #19885 (Vladimir).

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

  • Добавлена поддержка рамки окна RANGE OFFSET (для оконных функций) для типов с плавающей точкой. Реализованы оконные функции lagInFrame/leadInFrame, аналогичные lag/lead, но учитывающие рамку окна. Они совпадают, если рамка задана как between unbounded preceding and unbounded following. Это закрывает #5485. #21895 (Alexander Kuzmenkov).
  • Репликация без копирования данных для ReplicatedMergeTree с использованием хранилища S3. #16240 (ianton-ru).
  • Добавлена возможность миграции существующего S3-диска на схему с возможностями резервного копирования и восстановления. #22070 (Pavel Kovalenko).

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

  • Добавлена поддержка параллельного форматирования в clickhouse-local и везде, где это применимо. #21630 (Nikita Mikhaylov).
  • Добавлена поддержка параллельного парсинга для форматов CSVWithNames и TSVWithNames. Это закрывает #21085. #21149 (Nikita Mikhaylov).
  • Включено чтение с использованием mmap IO для диапазонов файлов от 64 MiB (настройка min_bytes_to_use_mmap_io). Это может дать умеренное улучшение производительности. #22326 (alexey-milovidov).
  • Добавлен кэш для файлов, читаемых с настройкой min_bytes_to_use_mmap_io. Это дает значительный прирост производительности (в 2 раза и более), когда значение настройки мало, за счет предотвращения частых вызовов mmap/munmap и связанных с ними page fault. Обратите внимание, что mmap IO имеет серьезные недостатки, из-за которых он менее надежен в production (например, зависание или SIGBUS на неисправных дисках; менее контролируемое использование памяти). Тем не менее для бенчмарков он подходит хорошо. #22206 (alexey-milovidov).
  • Исключено лишнее копирование данных при использовании кодека NONE. Обратите внимание, что кодек NONE в большинстве случаев бесполезен — рекомендуется всегда использовать сжатие (LZ4 используется по умолчанию). Вопреки распространенному мнению, отключение сжатия может не улучшить производительность (возможен и обратный эффект). Кодек NONE полезен в некоторых случаях: - когда данные не поддаются сжатию; - для синтетических бенчмарков. #22145 (alexey-milovidov).
  • Ускорен GROUP BY при небольшом max_rows_to_group_by и group_by_overflow_mode='any'. #21856 (Nikolai Kochetov).
  • Оптимизирована производительность запросов вида SELECT ... FINAL ... WHERE. Теперь в запросах с FINAL разрешено переносить в PREWHERE столбцы, входящие в ключ сортировки. #21830 (foolchi).
  • Производительность улучшена за счет замены memcpy на другую реализацию. Это закрывает #18583. #21520 (alexey-milovidov).
  • Улучшена производительность агрегации в порядке ключа сортировки (при включенной настройке optimize_aggregation_in_order). #19401 (Anton Popov).

Улучшение

  • Добавлен пул соединений для табличного движка PostgreSQL, движка базы данных PostgreSQL и источника словаря. Это должно исправить #21444. #21839 (Kseniia Sumarokova).
  • Поддержка схемы таблицы, отличной от схемы по умолчанию, для postgres storage/table-function. Закрывает #21701. #21711 (Kseniia Sumarokova).
  • Добавлена поддержка приоритета реплик для postgres-источника словаря. #21710 (Kseniia Sumarokova).
  • Добавлена новая настройка MergeTree min_bytes_to_rebalance_partition_over_jbod, которая позволяет равномерно распределять новые части по разным дискам JBOD-тома. #16481 (Amos Bird).
  • В столбец query_kind таблицы system.query_log для соответствующих запросов добавлены значения Grant, Revoke и System. #21102 (Vasily Nemkov).
  • Добавлена возможность отдельно настраивать тайм-ауты для HTTP-соединений, используемых для репликации, независимо от других HTTP-тайм-аутов. #20088 (nvartolomei).
  • Улучшено сообщение об исключении на клиенте в случае ошибки во время записи блоков сервером. В предыдущих версиях клиент мог получать вводящее в заблуждение сообщение, например Data compressed with different methods. #22427 (alexey-milovidov).
  • Исправлена ошибка Directory tmp_fetch_XXX already exists, которая могла возникнуть после неудачной операции fetch части. Если временный каталог fetch уже существует, он удаляется. Исправление #14197. #22411 (nvartolomei).
  • Исправлен отчёт MSan для функции range с аргументом UInt256 (поддержка больших целых чисел является экспериментальной). Это закрывает #22157. #22387 (alexey-milovidov).
  • В таблицу system.processes добавлен столбец current_database. Он содержит текущую базу данных для запроса. #22365 (Alexander Kuzmenkov).
  • Добавлены регистронезависимый поиск по истории/навигация по ней и возможность перемещения по подсловам в clickhouse-client. #22105 (Amos Bird).
  • Если кортеж из NULL, например (NULL, NULL), находится в левой части оператора IN, а в правой части — кортежи без NULL, например SELECT (NULL, NULL) IN ((0, 0), (3, 1)), возвращается 0 вместо генерации исключения о несовместимых типах. Это выражение также может появляться в результате оптимизации чего-то вроде SELECT (NULL, NULL) = (8, 0) OR (NULL, NULL) = (3, 2) OR (NULL, NULL) = (0, 0) OR (NULL, NULL) = (3, 1). Это закрывает #22017. #22063 (alexey-milovidov).
  • Обновлена используемая версия simdjson до 0.9.1. Это устраняет #21984. #22057 (Vitaly Baranov).
  • Добавлены регистронезависимые псевдонимы для функций CONNECTION_ID() и VERSION(). Это устраняет проблему #22028. #22042 (Eugene Klimov).
  • В функцию windowFunnel добавлена опция strict_increase, чтобы учитывать каждое событие только один раз (исправляет #21835). #22025 (Vladimir).
  • Если ключ партиционирования таблицы MergeTree не включает столбцы Date или DateTime, но включает ровно один столбец DateTime64, значения этого столбца отображаются в столбцах min_time и max_time таблиц system.parts и system.parts_columns. В таблицу system.parts_columns добавлены столбцы min_time и max_time (это устраняет несоответствие с таблицей system.parts). Это закрывает #18244. #22011 (alexey-milovidov).
  • Добавлена поддержка настройки replication_alter_partitions_sync=1 в clickhouse-copier для перемещения партиций из вспомогательной таблицы в целевую таблицу. Уменьшены тайм-ауты по умолчанию. Исправлено #21911. #21912 (turbo jason).
  • Путь к каталогу данных таблиц EmbeddedRocksDB теперь отображается в системных таблицах. #21903 (tavplubix).
  • Добавлено событие профиля HedgedRequestsChangeReplica, тайм-аут чтения данных изменён с сек на мс. #21886 (Kruglov Pavel).
  • DiskS3 (экспериментальная возможность в стадии разработки). Исправлена ошибка, из-за которой не удавалось переместить каталог, если пункт назначения не пуст и используется диск cache. #21837 (Pavel Kovalenko).
  • Улучшено форматирование типов данных Array и Map в веб-интерфейсе. #21798 (alexey-milovidov).
  • Обновлять кластеры только при изменении их конфигураций. #21685 (Kruglov Pavel).
  • Передача настроек запроса и сеанса для распределённых DDL-запросов. Чтобы включить это, установите distributed_ddl_entry_format_version в значение 2. Добавлена настройка distributed_ddl_output_mode. Поддерживаемые режимы: none, throw (по умолчанию), null_status_on_timeout и never_throw. Прочие исправления и улучшения для движка базы данных Replicated. #21535 (tavplubix).
  • Если PODArray создавался с размером элемента, который не был ни делителем 16, ни числом, кратным 16, было возможно переполнение буфера. В текущих выпусках таких ошибок нет. #21533 (alexey-milovidov).
  • Добавлены столбцы last_error_time/last_error_message/last_error_stacktrace/remote в system.errors. #21529 (Azat Khuzhin).
  • Добавлены псевдонимы simpleJSONExtract/simpleJSONHas для visitParam/visitParamExtract{UInt, Int, Bool, Float, Raw, String}. Исправлено #21383. #21519 (fastio).
  • Добавлена настройка optimize_skip_unused_shards_limit, ограничивающая количество значений ключа сегментирования для optimize_skip_unused_shards. #21512 (Azat Khuzhin).
  • Улучшен clickhouse-format: теперь он не генерирует исключение, если после последнего запроса есть лишние пробелы или комментарий, и на раннем этапе генерирует исключение с понятным сообщением при форматировании ASTInsertQuery с данными. #21311 (flynn).
  • Улучшена поддержка целочисленных ключей для типа данных Map. #21157 (Anton Popov).
  • MaterializeMySQL: повторная попытка подключения к MySQL при потере соединения. #20961 (Håvard Kvålen).
  • Расширена поддержка случаев переписывания CROSS JOIN в INNER JOIN. #20392 (Vladimir).
  • Не создавать пустые части при INSERT при включенном параметре optimize_on_insert. Исправляет #20304. #20387 (Kruglov Pavel).
  • MaterializeMySQL: добавлен индекс minmax для пропуска данных для столбца _version. #20382 (Stig Bakken).
  • Добавлена опция --backslash для clickhouse-format, которая добавляет символ обратной косой черты в конце каждой строки форматированного запроса. #21494 (flynn).
  • Теперь ClickHouse не будет генерировать исключение LOGICAL_ERROR, если попытаться выполнить мутацию уже покрытой части. Исправляет #22013. #22291 (alesapin).

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

  • Перед отменой приёмника пакетов в HedgedConnections socket удалён из epoll, чтобы предотвратить возможное состояние гонки. Исправляет #22161. #22443 (Kruglov Pavel).
  • Добавлен (ранее отсутствовавший) учет памяти в процедурах параллельного парсинга. В предыдущих версиях был возможен OOM, когда результирующий набор содержал очень большие блоки данных. Это закрывает #22008. #22425 (alexey-milovidov).
  • Исправлено исключение, которое могло возникнуть, когда SELECT содержит константное условие WHERE, а в таблице-источнике есть столбцы, имена которых состоят из цифр. #22270 (LiuNeng).
  • Исправлена отмена запроса при use_hedged_requests=0 и async_socket_for_remote=1. #22183 (Azat Khuzhin).
  • Исправлено необработанное исключение в InterserverIOHTTPHandler. #22146 (Azat Khuzhin).
  • Исправлен entrypoint Docker на случай, если http_port отсутствует в конфигурации. #22132 (Ewout).
  • Исправлена ошибка Invalid number of rows in Chunk при использовании JOIN с TOTALS и arrayJoin. Закрывает #19303. #22129 (Vladimir).
  • Исправлено имя фонового пула потоков, который ранее опрашивал сообщения из Kafka. Движок Kafka с неисправным пулом потоков не сможет считывать сообщения из очереди сообщений. #22122 (fastio).
  • Исправлена ошибка при ожидании запросов OPTIMIZE и ALTER для движков таблиц ReplicatedMergeTree. Теперь запрос не будет зависать, если таблица была отсоединена или перезапущена. #22118 (alesapin).
  • Отключены async_socket_for_remote/use_hedged_requests для проблемных ядер Linux. #22109 (Azat Khuzhin).
  • Точка входа Docker: не выполнять chown для . в случае, если LOG_PATH пуст. Закрывает #22100. #22102 (filimonov).
  • В функции decrypt отсутствовала проверка минимального размера данных, зашифрованных в режиме AEAD. Это устраняет #21897. #22064 (alexey-milovidov).
  • В редких случаях слияние в CollapsingMergeTree может создавать гранулу с index_granularity + 1 строками. Из-за этого внутренняя проверка, добавленная в #18928 (затрагивает 21.2 и 21.3), может завершаться ошибкой Incomplete granules are not allowed while blocks are granules size. Эта ошибка не позволяла частям объединяться. #21976 (Nikolai Kochetov).
  • Откачено изменение из #15454, которое могло вызывать значительный рост использования памяти при загрузке внешних словарей хешированного типа. Закрывает #21935. #21948 (Maksim Kita).
  • Предотвращено наложение hedged-соединений (ошибка Unknown packet 9 from server). #21941 (Azat Khuzhin).
  • Исправлено чтение HTTP POST-запросов с типом содержимого “multipart/form-data” в некоторых случаях. #21936 (Ivan).
  • Исправлены некорректные результаты ORDER BY, когда запрос содержит оконные функции и применяется оптимизация чтения в порядке первичного ключа. Исправляет #21828. #21915 (Alexander Kuzmenkov).
  • Устранена взаимная блокировка при первом выполнении модели CatBoost. Закрывает #13832. #21844 (Kruglov Pavel).
  • Исправлен некорректный результат запроса (и возможный сбой), которые могли возникать, когда условие WHERE или HAVING проталкивалось перед GROUP BY. Исправление #21773. #21841 (Nikolai Kochetov).
  • Улучшена обработка ошибок и логирование в WriteBufferFromS3. #21836 (Pavel Kovalenko).
  • Исправлены возможные падения в агрегатных функциях с комбинатором Distinct при использовании двухуровневой агрегации. Это дополнительное исправление к #18365 . Воспроизводится только в производственной среде. #21818 (Amos Bird).
  • Исправлен анализ индексов для скалярных подзапросов. Это исправляет проблему #21717, появившуюся в #18896. #21766 (Amos Bird).
  • Исправлена ошибка в движках таблиц ReplicatedMerge: запрос ALTER MODIFY COLUMN не изменял тип столбца Decimal, если его размер (32 бита или 64 бита) не менялся. #21728 (alesapin).
  • Исправлено возможное зависание при одновременном выполнении OPTIMIZE и DROP для ReplicatedMergeTree. #21716 (Azat Khuzhin).
  • Исправлена функция arrayElement для типа Map при использовании константных целочисленных аргументов. #21699 (Anton Popov).
  • Исправлен SIGSEGV при обращении к отсутствующим атрибутам в ip_trie с access_to_key_from_attributes. #21692 (Azat Khuzhin).
  • Теперь сервер начинает принимать соединения только после инициализации DDLWorker и словарей. #21676 (Azat Khuzhin).
  • Добавлено преобразование типов для ключей таблиц типа Join (ранее это приводило к SIGSEGV). #21646 (Azat Khuzhin).
  • Исправлена отмена распределённых запросов (например, простого select из нескольких сегментов с limit, то есть select * from remote('127.{2,3}', system.numbers) limit 100) при async_socket_for_remote=1. #21643 (Azat Khuzhin).
  • Исправлена работа fsync_part_directory при горизонтальном слиянии. #21642 (Azat Khuzhin).
  • Удалены неизвестные столбцы из присоединяемой таблицы в WHERE для запросов к внешним движкам баз данных (MySQL, PostgreSQL). Закрывает #14614, #19288 (дубликат), #19645 (дубликат). #21640 (Vladimir).
  • std::terminate вызывался при ошибке записи данных в S3. #21624 (Vladimir).
  • Исправлена возможная ошибка Cannot find column, когда включен параметр optimize_skip_unused_shards и не используется ни одного сегмента. #21579 (Azat Khuzhin).
  • Если в запросе есть константное условие WHERE и включена настройка optimize_skip_unused_shards, могут быть пропущены все сегменты, из-за чего запрос может вернуть некорректный пустой результат. #21550 (Amos Bird).
  • Исправлено: табличная функция clusterAllReplicas возвращала неверный _shard_num. Закрыт #21481. #21498 (flynn).
  • Исправлена ошибка, из-за которой таблица S3 после обновления конфигурации сохраняла старые учетные данные. #21457 (Grigory Pervakov).
  • Исправлена гонка при доступе к SSL-объекту внутри SecureSocket в Poco. #21456 (Nikita Mikhaylov).
  • Исправлен разбор формата Avro в Kafka. Исправляет #21437. #21438 (Ilya Golshtein).
  • Исправлены тайм-ауты приёма и отправки, а также неблокирующее чтение в защищённом сокете. #21429 (Kruglov Pavel).
  • Флаг force_drop_table не работал для MATERIALIZED VIEW; ошибка исправлена. Исправляет #18943. #20626 (tavplubix).
  • Исправлены конфликты имён в PredicateRewriteVisitor. Это приводило к некорректной фильтрации в WHERE после полного JOIN. Закрывает #20497. #20622 (Vladimir).

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

  • Добавлены тесты Jepsen для ClickHouse Keeper. #21677 (alesapin).
  • Параллельный запуск тестов без сохранения состояния в CI. Зависит от #22181. #22300 (alesapin).
  • Включена проверка статуса для CI-прогона SQLancer. #22015 (Ilya Yatsishin).
  • Несколько подготовительных изменений для сборок под PowerPC: включён встроенный openldap на ppc64le. #22487 (Kfir Itzhak). Включена компиляция на ppc64le с использованием Clang. #22476 (Kfir Itzhak). Исправлена компиляция boost на ppc64le. #22474 (Kfir Itzhak). Исправлена ошибка CMake, связанная с тем, что внутренняя переменная CMake CMAKE_ASM_COMPILE_OBJECT не задана на ppc64le. #22469 (Kfir Itzhak). Исправлена проблема в Fedora/RHEL/CentOS, из-за которой на ppc64le не находился libclang_rt.builtins. #22458 (Kfir Itzhak). Включена сборка с jemalloc на ppc64le. #22447 (Kfir Itzhak). Исправлено встраивание конфигурации ClickHouse и данных о часовом поясе из cctz на ppc64le. #22445 (Kfir Itzhak). Исправлена компиляция на ppc64le, а также использование правильного регистра указателя инструкций на ppc64le. #22430 (Kfir Itzhak).
  • Снова включена библиотека S3 (AWS) для aarch64. #22484 (Kfir Itzhak).
  • Добавлен tzdata в Docker-контейнеры, так как он требуется для чтения форматов ORC. Это закрывает #14156. #22000 (alexey-milovidov).
  • В Dockerfile образа clickhouse-server добавлены 2 аргумента: deb_location и single_binary_location. #21977 (filimonov).
  • Разрешено использовать clang-tidy с релизными сборками, если при его использовании включены assertions. #21914 (alexey-milovidov).
  • В скрипты CMake добавлен поиск бинарных файлов llvm-12. Добавлены неявные преобразования констант для подавления предупреждений clang. Обновлены подмодули для сборки с CMake 3.19. Подавлена рекурсия при раскрытии макросов в библиотеке readpassphrase. Устаревший параметр -fuse-ld для clang заменён на --ld-path. #21597 (Ilya Yatsishin).
  • Обновлён docker/test/testflows/runner/dockerd-entrypoint.sh для использования Yandex dockerhub-proxy, поскольку Docker Hub ввёл очень жёсткие ограничения на частоту запросов #21551 (vzakaznikov).
  • Исправлена сборка разделяемой библиотеки для macOS. #20184 (nvartolomei).
  • В zookeeper-dump-tree добавлена опция ctime. Она позволяет выводить время создания узла. #21842 (Ilya).

Релиз ClickHouse 21.3 (LTS)

Релиз ClickHouse v21.3, 2021-03-12

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

  • Теперь нельзя создавать таблицы MergeTree в старом синтаксисе с TTL таблицы, поскольку он просто игнорируется. Attach старых таблиц по-прежнему возможен. #20282 (alesapin).
  • Теперь все регистронезависимые имена функций будут приводиться к их каноническому виду. Это необходимо для маршрутизации запросов к проекциям (будущая возможность). #20174 (Amos Bird).
  • Исправлено создание TTL в случаях, когда его выражение является функцией и совпадает с ключом ORDER BY. Теперь в TTL с GROUP BY разрешено задавать пользовательскую агрегацию для столбцов первичного ключа. Обратно несовместимо: для столбцов первичного ключа, которые не входят в GROUP BY и теперь не заданы явно, при истечении TTL применяется функция any вместо max. Также, если вы используете TTL с WHERE или GROUP BY, во время rolling update при слияниях могут возникать исключения. #15450 (Anton Popov).

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

  • Добавлены настройки движка File: engine_file_empty_if_not_exists и engine_file_truncate_on_insert. #20620 (M0r64n).
  • Добавлена агрегатная функция deltaSum для суммирования разностей между соседними строками. #20057 (Russ Frank).
  • В таблице system.part_log появился новый столбец event_time_microseconds. #20027 (Bharat Nallan).
  • Добавлена функция timezoneOffset(datetime), которая возвращает смещение относительно UTC в секундах. Это закрывает #issue:19850. #19962 (keenwolf).
  • Добавлена настройка insert_shard_id, позволяющая поддерживать вставку данных в конкретный сегмент из таблицы Distributed. #19961 (flynn).
  • Функция reinterpretAs обновлена и теперь поддерживает большие целые числа. Исправлено #19691. #19858 (Maksim Kita).
  • В клиент S3 добавлена поддержка Server Side Encryption Customer Keys (заголовок x-amz-server-side-encryption-customer-(key/md5)). См. ссылку. Закрывает #19428. #19748 (Vladimir Chebotarev).
  • Добавлена опция implicit_key для источника словаря executable. Она позволяет не выводить ключ для каждой записи, если записи поступают в том же порядке, что и входные ключи. Реализует #14527. #19677 (Maksim Kita).
  • Добавлены типы квот query_selects и query_inserts. #19603 (JackyWoo).
  • Добавлена функция extractTextFromHTML #19600 (zlx19950903), (alexey-milovidov).
  • У таблиц с движком MergeTree* теперь есть две новые настройки уровня таблицы для управления параллелизмом запросов. Настройка max_concurrent_queries ограничивает количество одновременно выполняемых запросов, связанных с этой таблицей. Настройка min_marks_to_honor_max_concurrent_queries указывает применять предыдущую настройку только в том случае, если запрос читает как минимум такое количество меток. #19544 (Amos Bird).
  • Добавлена функция file для чтения файла из каталога user_files в виде String. Она отличается от табличной функции file. Это реализует #issue:18851. #19204 (keenwolf).

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

  • Добавлен экспериментальный движок базы данных Replicated. Он реплицирует DDL-запросы на несколько хостов. #16193 (tavplubix).
  • Добавлена экспериментальная поддержка оконных функций, включаемая с помощью allow_experimental_window_functions = 1. Это предварительная альфа-реализация, не подходящая для использования в production, и в будущих релизах будет изменяться с нарушением обратной совместимости. Список поддерживаемых возможностей см. в документации. #20337 (Alexander Kuzmenkov).
  • Добавлена возможность резервного копирования и восстановления файлов метаданных для DiskS3. #18377 (Pavel Kovalenko).

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

  • Хеджированные запросы для удалённых запросов. Если включён параметр use_hedged_requests (по умолчанию выключен), для запроса разрешается устанавливать несколько соединений с разными репликами. Новое соединение устанавливается, если существующее соединение с репликой не было установлено в течение hedged_connection_timeout или в течение receive_data_timeout не были получены данные. Запрос использует первое соединение, которое отправит непустой пакет Прогресс (или пакет данные, если allow_changing_replica_until_first_data_packet); остальные соединения отменяются. Поддерживаются запросы с max_parallel_replicas > 1. #19291 (Kruglov Pavel). Это позволяет значительно уменьшить хвостовые задержки в очень больших кластерах.
  • Добавлена поддержка PREWHERE (и включена соответствующая оптимизация) для таблиц, в которых заданы выражения безопасности на уровне строк. #19576 (Denis Glazachev).
  • Параметр distributed_aggregation_memory_efficient включён по умолчанию. Это снизит расход памяти и повысит производительность распределённых запросов. #20599 (alexey-milovidov).
  • Улучшена производительность GROUP BY с несколькими ключами фиксированного размера. #20472 (alexey-milovidov).
  • Повышена производительность агрегатных функций за счёт более строгого алиасинга. #19946 (alexey-milovidov).
  • Ускорено чтение из таблиц Memory в экстремальных случаях (когда скорость чтения достигает порядка 50 ГБ/с) путём упрощения конвейера и, как следствие, снижения конкуренции за блокировки при его планировании. #20468 (alexey-milovidov).
  • HTTP-сервер частично переработан, чтобы сократить количество копирований входящих и исходящих данных. Это даёт прирост производительности до 1,5 раза при вставке длинных записей через HTTP. #19516 (Ivan).
  • Добавлена настройка compress для таблиц Memory. Если она включена, таблица будет использовать меньше оперативной памяти. На некоторых машинах и наборах данных SELECT также может выполняться быстрее, но это не всегда так. Это закрывает #20093. Примечание: есть причины, по которым таблицы Memory могут работать медленнее, чем MergeTree: (1) отсутствие сжатия (2) статический размер блоков (3) отсутствие индексов и prewhere… #20168 (alexey-milovidov).
  • Небольшое улучшение кода агрегации. #20978 (alexey-milovidov).
  • Возвращены специализации intDiv/modulo для повышения производительности. Это исправляет #21293 . Регрессия появилась в https://github.com/ClickHouse/ClickHouse/pull/18145 . #21307 (Amos Bird).
  • Не следует слишком сильно объединять блоки при INSERT SELECT, если данные вставляются в таблицу Memory. В предыдущих версиях после INSERT SELECT в таблице Memory создавалось неэффективное представление данных. Это закрывает #13052. #20169 (alexey-milovidov).
  • Исправлен как минимум один сценарий, при котором парсер DataType мог работать с экспоненциальной сложностью (обнаружено с помощью фаззера). Это закрывает #20096. #20132 (alexey-milovidov).
  • Распараллелено выполнение SELECT с FINAL для одиночной части с уровнем > 0, когда значение настройки do_not_merge_across_partitions_select_final равно 1. #19375 (Kruglov Pavel).
  • При запросе к system.parts и system.parts_columns заполняются только запрошенные столбцы. Закрывает #19570. #21035 (Anmol Arora).
  • Выполнена алгебраическая оптимизация арифметических выражений внутри агрегатной функции avg. Закрывает #20092. #20183 (flynn).

Улучшение

  • Регистронезависимые методы сжатия для табличных функций. Также исправлен метод сжатия LZMA, который ранее проверялся только в верхнем регистре. #21416 (Vladimir Chebotarev).
  • Добавлены две настройки, позволяющие задерживать вставку или генерировать исключение при слишком большом количестве неактивных частей. Это полезно, когда сервер не успевает достаточно быстро очищать части. #20178 (Amos Bird).
  • Улучшена совместимость с клиентами mysql: 1. mysql jdbc 2. mycli. #21367 (Amos Bird).
  • Запрещено удалять столбец, если на него ссылается materialized view. Закрывает #21164. #21303 (flynn).
  • Источник словаря MySQL теперь будет повторно пытаться подключиться при неожиданных разрывах соединения (Lost connection to MySQL server during query), которые иногда происходят в SSL/TLS‑соединениях. #21237 (Alexander Kazakov).
  • Улучшение удобства использования: более единообразный разбор DateTime64: теперь распознаётся случай, когда Unix-временная метка с субсекундным разрешением указана как масштабированное целое число (например, 1111111111222 вместо 1111111111.222). Это закрывает #13194. #21053 (alexey-milovidov).
  • Выполнять только слияние отсортированных блоков на инициаторе при использовании distributed_group_by_no_merge. #20882 (Azat Khuzhin).
  • При загрузке конфигурации для mysql-источника ClickHouse теперь будет случайным образом перемешивать список реплик с одинаковым приоритетом, чтобы обеспечить циклический выбор конечной точки mysql. Это закрывает #20629. #20632 (Alexander Kazakov).
  • Функция ‘reinterpretAs(x, Type)’ была переименована в ‘reinterpret(x, Type)’. #20611 (Maksim Kita).
  • Добавлена поддержка vhost для движка RabbitMQ #20576. #20596 (Kseniia Sumarokova).
  • Улучшена сериализация для типов данных, представляющих собой комбинации Array и Tuple. Улучшено сопоставление типов данных enum с типом enum в protobuf. Исправлена сериализация типа данных Map. Пропущенным значениям теперь назначаются значения по умолчанию. #20506 (Vitaly Baranov).
  • Исправлено состояние гонки между выполнением задач distributed DDL и очисткой очереди DDL. Теперь задачу DDL нельзя удалить из ZooKeeper, если есть активные воркеры. Исправление #20016. #20448 (tavplubix).
  • Обеспечена корректная работа FQDN и других функций, связанных с DNS, в образах Alpine. #20336 (filimonov).
  • Запрещена ранняя свёртка констант для функций, явно помеченных как запрещённые. #20303 (Azat Khuzhin).
  • Неявное преобразование из целочисленного типа в Decimal могло проходить успешно, даже если целочисленное значение не помещалось в Decimal. Теперь в таком случае генерируется ARGUMENT_OUT_OF_BOUND. #20232 (tavplubix).
  • Неблокирующий SYSTEM FLUSH DISTRIBUTED. #20215 (Azat Khuzhin).
  • Нормализованы выражения count(constant) и sum(1) к виду count(). Это необходимо для маршрутизации запросов к проекциям. #20175 (Amos Bird).
  • Добавлена поддержка всех нативных целочисленных типов в функциях битмапа. #20171 (Amos Bird).
  • Обновлены CacheDictionary, ComplexCacheDictionary, SSDCacheDictionary, SSDComplexKeyDictionary: теперь в качестве внутреннего индекса используется LRUHashMap. #20164 (Maksim Kita).
  • Параметр access_management теперь можно настраивать при запуске, указав CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT; по умолчанию он отключён (0), как и раньше. #20139 (Marquitos).
  • Исправлено toDateTime64(toDate()/toDateTime()) для DateTime64 — реализовано ограничение значений DateTime64 для соответствия поведению DateTime. #20131 (Azat Khuzhin).
  • Улучшения квот: SHOW TABLES теперь считается одним запросом при расчёте квот, а не двумя. Запросы SYSTEM теперь также расходуют квоту. Исправлен расчёт конца интервала при расходовании квоты. #20106 (Vitaly Baranov).
  • Добавлена поддержка выражений path IN (set) для таблицы system.zookeeper. #20105 (小路).
  • Отображать полную информацию о таблицах MaterializeMySQL в system.tables. #20051 (Stig Bakken).
  • Исправлено состояние гонки в словаре executable, которое было возможно только при некорректном использовании (когда скрипт возвращает данные, игнорируя входные данные). #20045 (alexey-milovidov).
  • Значением опции MYSQL_OPT_RECONNECT теперь можно управлять с помощью параметра “opt_reconnect” в разделе config MySQL-реплики. #19998 (Alexander Kazakov).
  • Если пользователь вызывает функцию JSONExtract с запрошенным типом Float32, теперь допускается неточное преобразование в результирующий тип. Например, число 0.1 в JSON имеет двойную точность и не может быть точно представлено в Float32, но пользователь всё равно хочет его получить. В предыдущих версиях возвращалось 0 для типа, отличного от Nullable, и NULL для типа Nullable, чтобы показать, что преобразование неточное. Логика была на 100% корректной, но это удивляло пользователей и вызывало вопросы. Это закрывает #13962. #19960 (alexey-milovidov).
  • Добавлено преобразование структуры блока для INSERT в таблицы Distributed, если структура не совпадает. #19947 (Azat Khuzhin).
  • Улучшение таблицы system.distributed_ddl_queue. После перезапуска MaxDDLEntryID инициализируется последним значением. До этого PR MaxDDLEntryID оставался равным нулю, пока не обрабатывался новый DDLTask. #19924 (Amos Bird).
  • Отображать таблицы MaterializeMySQL в system.parts. #19770 (Stig Bakken).
  • Добавлена отдельная директива конфигурации для профиля Buffer. #19721 (Azat Khuzhin).
  • Перемещены в предложение WHERE условия, не относящиеся к JOIN. #18720. #19685 (hexiaoting).
  • Добавлена возможность замедлять INSERT в Distributed в зависимости от объёма байтов, ожидающих асинхронной отправки (для движка Distributed добавлены настройки bytes_to_delay_insert/max_delay_to_insert и bytes_to_throw_insert). #19673 (Azat Khuzhin).
  • Исправлены некоторые редкие случаи, при которых ошибки записи могли игнорироваться в деструкторах. #19451 (Azat Khuzhin).
  • Вывод инлайн-фреймов в трассировках стека при фатальных ошибках. #19317 (Ivan).

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

  • Исправлены избыточные повторные подключения к ZooKeeper и возможность наличия двух активных сеансов у одного сервера ClickHouse. Обе проблемы появились в #14678. #21264 (alesapin).
  • Исправлена ошибка Bad cast from type ... to DB::ColumnLowCardinality при вставке в таблицу со столбцом LowCardinality в формате Values. Закрывает #21140 #21357 (Nikolai Kochetov).
  • Исправлена взаимоблокировка в мутациях ALTER DELETE для нереплицируемых движков таблиц MergeTree, когда предикат содержит саму таблицу. Исправляет #20558. #21477 (alesapin).
  • Исправлен SIGSEGV при сбоях в распределённых запросах. #21434 (Azat Khuzhin).
  • Теперь запросы ALTER MODIFY COLUMN будут корректно применять изменения к ключу партиционирования, индексам пропуска, TTL и т. д. Исправлено #13675. #21334 (alesapin).
  • Исправлена ошибка с join_use_nulls и JOIN TOTALS из подзапросов. Это закрывает #19362 и #21137. #21248 (vdimir).
  • Устранено падение в EXPLAIN для запроса с UNION. Исправлены #20876, #21170. #21246 (flynn).
  • Теперь мутации разрешены только для движков таблиц, которые их поддерживают (семейство MergeTree, Memory, MaterializedView). Для остальных движков будет выводиться более понятная ошибка. Исправление #21168. #21183 (alesapin).
  • Исправление #21112. Исправлена ошибка, которая могла приводить к дубликатам при выполнении запроса вставки (если один из обратных вызовов срабатывал чуть позже, чем нужно). #21138 (Kseniia Sumarokova).
  • Исправлено применение input_format_null_as_default, когда используются типы Nullable. Это исправляет #21116. #21121 (Amos Bird).
  • исправлена ошибка, связанная с приведением типа Tuple к Map. Закрывает #21029. #21120 (hexiaoting).
  • Исправлена утечка метаданных при удалении Replicated*MergeTree с пользовательским кластером ZooKeeper (не используемым по умолчанию). #21119 (fastio).
  • Исправлена ошибка несоответствия типов при использовании ключей LowCardinality в joinGet. Исправление #21114. #21117 (Amos Bird).
  • исправлено: значения default_replica_path и default_replica_name бесполезны для движка Replicated(*)MergeTree, если для него нужно указывать другие параметры. #21060 (mxzlxy).
  • Был возможен доступ к памяти за пределами допустимых границ при форматировании специально созданного выходящего за диапазон значения типа DateTime64. Это закрывает #20494. Это закрывает #20543. #21023 (alexey-milovidov).
  • Запрещены параллельные вставки в движок Join. #21009 (vdimir).
  • Исправлено поведение, при котором ALTER MODIFY COLUMN создавал мутацию, заведомо завершающуюся ошибкой. #21007 (Anton Popov).
  • Закрывает #9969. Исправлена ошибка HTTP-сжатия Brotli, которая воспроизводилась при больших объёмах данных, более сложной структуре и в формате вывода JSON. Brotli обновлён до последней версии, чтобы включить исправление “редкого доступа к неинициализированным данным в ring-buffer”. #20991 (Kseniia Sumarokova).
  • Исправлена ошибка ‘Пустая задача была возвращена из асинхронной очереди задач’ при отмене запроса. #20881 (Azat Khuzhin).
  • USE database; запрос не работал при подключении к серверу ClickHouse с помощью клиента MySQL 5.7; это исправлено. Исправлено в #18926. #20878 (tavplubix).
  • Исправлена работа комбинатора -Distinct с комбинатором -State в агрегатных функциях. #20866 (Anton Popov).
  • Исправлен подзапрос с UNION DISTINCT и оператором LIMIT. Закрывает #20597. #20610 (flynn).
  • Исправлено непоследовательное поведение словаря при запросах, в которых выполняется поиск отсутствующих в словаре ключей. #20578 (Nikita Mikhaylov).
  • Исправлено число потоков для скалярных подзапросов и подзапросов для индекса (после #19007 всегда использовался только один поток). Исправляет #20457, #20512. #20550 (Nikolai Kochetov).
  • Исправлен сбой, который мог возникать при получении неизвестного пакета от remove query (добавлено в #17868). #20547 (Azat Khuzhin).
  • Добавлены необходимые проверки при разборе имён каталогов для асинхронной вставки (исправляет SIGSEGV). #20498 (Azat Khuzhin).
  • Исправлена ошибка, из-за которой функция transform некорректно работала с ключами с плавающей точкой. Закрывает #20460. #20479 (flynn).
  • Исправлен бесконечный цикл при распространении псевдонимов WITH в подзапросы. Исправлена проблема #20388. #20476 (Amos Bird).
  • Исправлено аварийное завершение работы сервера при отключении HTTP-клиента. #20464 (Azat Khuzhin).
  • Исправлена LOGICAL_ERROR для join_use_nulls=1, когда JOIN содержит константу из SELECT. #20461 (Azat Khuzhin).
  • Проверять, используется ли табличная функция view в списке выражений, и генерировать ошибку. Это исправляет #20342. #20350 (Amos Bird).
  • Исправлено недопустимое разыменование в словаре RANGE_HASHED(). #20345 (Azat Khuzhin).
  • Исправлена ошибка разыменования NULL при join_use_nulls=1. #20344 (Azat Khuzhin).
  • Исправлен некорректный результат бинарных операций между двумя константными значениями Decimal с разным количеством знаков после запятой. Исправляет #20283. #20339 (Maksim Kita).
  • Исправлены слишком частые повторные попытки выполнения неудачных фоновых задач в семействе движков таблиц ReplicatedMergeTree. Это могло приводить к чрезмерно подробному логированию и повышенной нагрузке на CPU. Исправляет #20203. #20335 (alesapin).
  • Ограничены операции DROP и RENAME для столбца версии в движках таблиц *CollapsingMergeTree и ReplacingMergeTree. #20300 (alesapin).
  • Исправлено поведение, при котором в случае повреждённого JSON выполнялась попытка прочитать весь файл в память, что приводило к исключению в аллокаторе. Исправляет #19719. #20286 (Nikita Mikhaylov).
  • Исправлено исключение при вертикальном слиянии для семейства движков таблиц MergeTree, в которых вертикальные слияния не поддерживаются. Исправляет #20259. #20279 (alesapin).
  • Исправлен редкий сбой сервера при перезагрузке конфигурации в процессе завершения работы. Исправление #19689. #20224 (alesapin).
  • Исправлено использование CTE в INSERT SELECT. Исправлены #20187 и #20195. #20211 (Amos Bird).
  • Исправлено #19314. #20156 (Ivan).
  • исправлена функция toMinute для корректной обработки специального часового пояса. #20149 (keenwolf).
  • Исправлено аварийное завершение работы сервера после запроса с функцией if, в котором результат ветвей then/else имеет тип Tuple. Тип Tuple должен содержать Array или другой сложный тип. Исправляет #18356. #20133 (alesapin).
  • Движок таблицы MongoDB теперь устанавливает соединение только при чтении данных. ATTACH TABLE больше не пытается подключаться. #20110 (Vitaly Baranov).
  • Исправление ошибки в StorageJoin. #20079 (vdimir).
  • Исправлен случай, когда при вычислении остатка от деления отрицательного числа на небольшой делитель результирующий тип данных был недостаточно велик, чтобы вместить отрицательный результат. Это закрывает #20052. #20067 (alexey-milovidov).
  • MaterializeMySQL: Исправлена репликация для команд, обновляющих несколько таблиц. #20066 (Håvard Kvålen).
  • Предотвращена ошибка “Connection refused” в Docker во время выполнения скрипта инициализации. #20012 (filimonov).
  • EmbeddedRocksDB — экспериментальное хранилище. Исправлена проблема с отсутствием корректной проверки типов. Код упрощён. Это закрывает #19967. #19972 (alexey-milovidov).
  • Исправлен segfault в функции fromModifiedJulianDay, возникавший, когда тип аргумента — Nullable(T) для любых целочисленных типов, кроме Int32. #19959 (PHO).
  • Исправление сбоя индекса BloomFilter. Исправляет #19757. #19884 (Maksim Kita).
  • Была возможна взаимная блокировка, если включен system.text_log. Это исправление #19874. #19875 (alexey-milovidov).
  • Исправлен запуск сервера при наличии таблиц с выражениями по умолчанию, содержащими dictGet(). Теперь можно получать тип возвращаемого значения dictGet() без загрузки словаря. #19805 (Vitaly Baranov).
  • Исправлено аварийное завершение clickhouse-client при выполнении только запроса select. #19790 (taiyang-li).
  • Исправлена ошибка, из-за которой перемещение частей в целевую таблицу могло завершиться сбоем при запуске нескольких экземпляров clickhouse-copier. #19743 (madianjun).
  • Фоновый поток, выполняющий запросы ON CLUSTER, мог зависнуть, ожидая каких-либо действий от удалённой реплицируемой таблицы. Это исправлено. #19684 (yiguolei).

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

  • Добавлена возможность собирать ClickHouse с глобально включённым AVX-2. Это даёт небольшой прирост производительности на современных CPU. Не рекомендуется для production и пока не будет поддерживаться в качестве официальной сборки. #20180 (alexey-milovidov).
  • Исправлены некоторые проблемы, обнаруженные Coverity. См. #19964. #20010 (alexey-milovidov).
  • Добавлена возможность запуска с изменённым бинарным файлом под gdb. В предыдущей версии, если установить точку останова в gdb до запуска, сервер отказывался запускаться из-за неудачной проверки целостности. #21258 (alexey-milovidov).
  • Добавлен тест для различных методов сжатия в Kafka. #21111 (filimonov).
  • Исправлен конфликт портов в тесте test_storage_kerberized_hdfs. #19974 (Ilya Yatsishin).
  • Добавлен вывод stdout и stderr в лог, если не удалось запустить docker в интеграционных тестах. До этого PR в таком случае выводилось очень короткое сообщение об ошибке, которое не помогало разобраться в проблеме. #20631 (Vitaly Baranov).

Релиз ClickHouse 21.2

Релиз ClickHouse v21.2.2.8-stable, 2021-02-07

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

  • Побитовые функции (bitAnd, bitOr и т. д.) запрещены для аргументов типа с плавающей запятой. Теперь необходимо выполнять явное приведение к целому типу. #19853 (Azat Khuzhin).
  • Функции lcm/gcd запрещены для чисел с плавающей запятой. #19532 (Azat Khuzhin).
  • Исправлено отслеживание памяти для OPTIMIZE TABLE/операций слияния; добавлен учет ограничений памяти запроса и сэмплирования для OPTIMIZE TABLE/операций слияния. #18772 (Azat Khuzhin).
  • Использование столбца с типом с плавающей запятой в качестве ключа партиционирования запрещено, см. #18421. #18464 (hexiaoting).
  • Лишние скобки в определениях типов больше не поддерживаются, пример: Array((UInt8)).

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

  • Добавлен движок таблицы PostgreSQL (с поддержкой и select, и insert, а также многомерных массивов), а также табличная функция. Добавлен источник словаря PostgreSQL. Добавлен движок базы данных PostgreSQL. #18554 (Kseniia Sumarokova).
  • Тип данных Nested теперь поддерживает произвольные уровни вложенности. Добавлены подстолбцы сложных типов, такие как size0 в Array, null в Nullable и имена элементов Tuple, которые можно читать, не считывая весь столбец. #17310 (Anton Popov).
  • Добавлена поддержка Nullable в FlatDictionary, HashedDictionary, ComplexKeyHashedDictionary, DirectDictionary, ComplexKeyDirectDictionary, RangeHashedDictionary. #18236 (Maksim Kita).
  • Добавляет новую таблицу system.distributed_ddl_queue, которая отображает запросы из очереди DDL-воркера. #17656 (Bharat Nallan).
  • Добавлена поддержка сопоставления имён LDAP-групп и значений атрибутов в целом с локальными ролями для пользователей из пользовательских каталогов LDAP. #17211 (Denis Glazachev).
  • Добавлена поддержка вставки в табличную функцию cluster, а также поддержка распределения данных по узлам с указанием ключа сегментирования для табличных функций remote и cluster. Закрывает #16752. #18264 (flynn).
  • Добавлена функция decodeXMLComponent для декодирования символов в XML. Пример: SELECT decodeXMLComponent('Hello,&quot;world&quot;!') #17659. #18542 (nauta).
  • Добавлены функции parseDateTimeBestEffortUSOrZero и parseDateTimeBestEffortUSOrNull. #19712 (Maksim Kita).
  • Добавлена функция sign для математических вычислений. #19527 (flynn).
  • В system.query_log добавлена информация об используемых возможностях (функциях, движках таблиц и т. д.). #18495. #19371 (Kseniia Sumarokova).
  • Функция formatDateTime поддерживает модификатор %Q для форматирования даты с указанием квартала. #19224 (Jianmei Zhang).
  • Добавлена поддержка сочетания клавиш MetaKey+Enter в интерфейсе play. #19012 (sundyli).
  • Добавлены три функции для типа данных Map: 1. mapContains(map, key) для проверки, содержит ли map.keys ключ, переданный вторым параметром. 2. mapKeys(map) возвращает все ключи в формате Array 3. mapValues(map) возвращает все значения в формате Array. #18788 (hexiaoting).
  • Добавлена настройка log_comment в связи с #18494. #18549 (Zijie Lu).
  • Добавлена поддержка аргумента типа Tuple для функций argMin и argMax. #17359 (Ildus Kurbangaliev).
  • Добавлена поддержка синтаксиса EXISTS VIEW. #18552 (Du Chuan).
  • Добавлен синтаксис SELECT ALL. Закрывает #18706. #18723 (flynn).

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

  • Ускорено удаление частей за счёт сокращения числа системных вызовов stat. Возвращена оптимизация, существовавшая некоторое время назад. Также сделан более безопасный интерфейс IDisk. Это закрывает #19065. #19086 (alexey-milovidov).
  • Псевдонимы, объявленные в операторе WITH, теперь корректно используются при анализе индексов. Запросы вида WITH column AS alias SELECT ... WHERE alias = ... теперь могут использовать индекс. #18896 (Amos Bird).
  • Добавлен optimize_alias_column_prediction (включён по умолчанию), который: - учитывает столбцы с псевдонимами в WHERE при отсечении партиций и пропуске данных с помощью вторичных индексов; - учитывает столбцы с псевдонимами в WHERE для тривиальных запросов count в optimize_trivial_count; - учитывает столбцы с псевдонимами в GROUP BY/ORDER BY для optimize_aggregation_in_order/optimize_read_in_order. #16995 (sundyli).
  • Ускорена агрегатная функция sum. Улучшение заметно только на синтетических бенчмарках и не слишком практично. #19216 (alexey-milovidov).
  • Обновлён libc++, используется другой ABI для повышения производительности. #18914 (Danila Kutenin).
  • Функции sumIf() и sum(if()) переписываются в countIf(), когда они логически эквивалентны. #17041 (flynn).
  • Для соединений с S3 используется пул соединений, управляемый настройкой s3_max_connections. #13405 (Vladimir Chebotarev).
  • Добавлена поддержка опции zstd long для лучшего сжатия строковых столбцов и экономии места. #17184 (ygrek).
  • Незначительно снижена задержка сервера за счёт отказа от обращения к конфигурации при каждом соединении. #19863 (alexey-milovidov).
  • Снижено состязание за блокировки для нескольких слоёв движка Buffer. #19379 (Azat Khuzhin).
  • Добавлена поддержка разделения шага Filter в плане запроса на пару Expression + Filter. Вместе с оптимизацией слияния Expression + Expression (#17458) это может отложить вычисление некоторых выражений до шага после Filter. #19253 (Nikolai Kochetov).

Улучшение

  • SELECT count() FROM table теперь можно выполнить, если из table можно выбрать хотя бы один столбец. Это изменение исправляет #10639. #18233 (Vitaly Baranov).
  • При взаимодействии с удалёнными серверами MySQL используется кодировка utf8mb4. Исправляет #19795. #19800 (alexey-milovidov).
  • Табличная функция S3 теперь поддерживает режим сжатия auto (автоопределение). Это закрывает #18754. #19793 (Vladimir Chebotarev).
  • Обеспечен корректный вывод бесконечных аргументов для функции formatReadableTimeDelta. В предыдущих версиях выполнялось неявное преобразование в зависящее от реализации целочисленное значение. #19791 (alexey-milovidov).
  • Табличная функция S3 будет использовать глобальный регион, если регион не удаётся определить точно. Это закрывает #10998. #19750 (Vladimir Chebotarev).
  • В распределённых запросах, если включена настройка async_socket_for_remote, могло возникать переполнение стека как минимум в отладочной сборке, если в таблице используется очень глубоко вложенный тип данных (например, Array(Array(Array(...more...)))). Это исправляет #19108. Это изменение вносит небольшую обратную несовместимость: избыточные скобки в определениях типов больше не поддерживаются, пример: Array((UInt8)). #19736 (alexey-milovidov).
  • Добавлен отдельный пул для брокеров сообщений (RabbitMQ и Kafka). #19722 (Azat Khuzhin).
  • Исправлено редкое превышение лимита max_number_of_merges_with_ttl_in_pool (может назначаться больше слияний с TTL) для нереплицируемого MergeTree. #19708 (alesapin).
  • Словарь: улучшено сообщение об ошибке при разборе атрибута. #19678 (Maksim Kita).
  • Добавлена возможность отключить проверку контрольных сумм при чтении. Никогда не следует использовать это в production. Пожалуйста, не рассчитывайте на какие-либо преимущества от отключения этой проверки. Это может использоваться только для экспериментов и бенчмарков. Настройка применима только к таблицам семейства MergeTree. Для других движков таблиц и при получении данных по сети контрольные суммы проверяются всегда. По моим наблюдениям, разницы в производительности нет либо она составляет менее 0.5%. #19588 (alexey-milovidov).
  • Поддержка константного результата в функции multiIf. #19533 (Maksim Kita).
  • Добавлена поддержка функций length/empty/notEmpty для типа данных Map, которые возвращают количество ключей в Map. #19530 (taiyang-li).
  • Добавлена опция --reconnect в clickhouse-benchmark. Если указать эту опцию, перед каждым запросом будет выполняться повторное подключение. Это нужно для тестирования. #19872 (alexey-milovidov).
  • Добавлена поддержка нового расположения файла .debug. Это исправляет #19348. #19520 (Amos Bird).
  • Функция toIPv6 разбирает адреса IPv4. #19518 (Bharat Nallan).
  • Добавлено поле http_referer в system.query_log, system.processes и т. д. Закрывает #19389. #19390 (alexey-milovidov).
  • Улучшена совместимость с MySQL: больше функций стали регистронезависимыми, а также были добавлены псевдонимы. #19387 (Daniil Kondratyev).
  • Добавлены метрики для частей MergeTree типов (Wide/Compact/InMemory). #19381 (Azat Khuzhin).
  • Разрешён запуск docker с произвольным uid. #19374 (filimonov).
  • Исправлено некорректное выравнивание значений типа данных IPv4 в форматах Pretty. Ранее они выравнивались по правому краю, а не по левому. Закрывает #19184. #19339 (alexey-milovidov).
  • Теперь можно изменять max_server_memory_usage без перезапуска. Это закрывает #18154. #19186 (alexey-milovidov).
  • В предыдущих версиях исключение, возникающее при вызове функции bar с определённым аргументом NaN, могло несколько вводить в заблуждение. Это исправляет #19088. #19107 (alexey-milovidov).
  • Явно установлены фиксированные значения uid / gid пользователя и группы clickhouse (101) в образах clickhouse-server. #19096 (filimonov).
  • Исправлена ошибка PeekableReadBuffer: Memory limit exceed, возникавшая при вставке данных с очень длинными строками. Исправлено в #18690. #18979 (tavplubix).
  • Docker-образ: несколько улучшений в entrypoint clickhouse-server. #18954 (filimonov).
  • Добавлены normalizeQueryKeepNames и normalizedQueryHashKeepNames для нормализации запросов без маскировки длинных имён символом ?. Это упрощает анализ сложных запросов в журнале запросов. #18910 (Amos Bird).
  • Проверка контрольной суммы каждого блока распределённого батча на отправителе перед отправкой (без повторного чтения файла: контрольные суммы проверяются в процессе чтения) позволяет избежать зависания INSERT на приёмнике (если на отправителе .bin-файл оказался усечённым). Исключено повторное чтение .bin-файлов для пакетного INSERT (оно требовалось для вычисления числа строк/байт с учётом squashing; теперь эта информация включена в заголовок, при этом обратная совместимость сохранена). #18853 (Azat Khuzhin).
  • Исправлены проблемы с RIGHT и FULL JOIN таблиц, содержащих состояния агрегатных функций. В предыдущих версиях возникало исключение, связанное с методом cloneResized. #18818 (templarzq).
  • Добавлены настройки конечной точки S3 с поддержкой префиксов. #18812 (Vladimir Chebotarev).
  • Добавлена поддержка типов аргументов [UInt8, UInt16, UInt32, UInt64] в функциях bitmapTransform, bitmapSubsetInRange, bitmapSubsetLimit, bitmapContains. Это закрывает #18713. #18791 (sundyli).
  • Разрешено дополнительно задавать псевдонимы для CTE (общих табличных выражений). CSE (устранение общих подвыражений) теперь распространяется на подзапросы того же уровня при enable_global_with_statement = 1. Это исправляет #17378 . Это исправляет https://github.com/ClickHouse/ClickHouse/pull/16575#issuecomment-753416235 . #18684 (Amos Bird).
  • Обновлена librdkafka до v1.6.0-RC2. Исправлена ошибка #18668. #18671 (filimonov).
  • При возникновении непредвиденных исключений автоматически перезапускается фоновый поток, отвечающий за выполнение запросов distributed DDL. Исправляет #17991. #18285 (徐炘).
  • Обновлён AWS C++ SDK для использования глобальных регионов в S3. #17870 (Vladimir Chebotarev).
  • Добавлена поддержка конструкции WITH ... [AND] [PERIODIC] REFRESH [interval_in_sec] при создании таблиц LIVE VIEW. #14822 (vzakaznikov).
  • Ограничено выполнение запросов MODIFY TTL для таблиц MergeTree, созданных с использованием старого синтаксиса. Ранее такой запрос выполнялся успешно, но фактически не давал никакого эффекта. #19064 (Anton Popov).

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

  • Исправлен анализ индексов для бинарных функций с константным argument, из-за которого запросы возвращали неверные результаты. Это исправляет #18364. #18373 (Amos Bird).
  • Исправлен запуск сервера с таблицами, у которых выражения по умолчанию содержат dictGet(). Теперь можно получать возвращаемый тип dictGet() без загрузки словаря. #19805 (Vitaly Baranov).
  • Исправлено падение сервера после запроса с функцией if, где результат ветвей then/else имел тип Tuple. При этом тип Tuple должен содержать Array или другой сложный тип. Исправляет #18356. #20133 (alesapin).
  • MaterializeMySQL (экспериментальная возможность): исправлена репликация для команд, обновляющих несколько таблиц. #20066 (Håvard Kvålen).
  • Предотвращена ошибка “Connection refused” в Docker во время выполнения скрипта инициализации. #20012 (filimonov).
  • EmbeddedRocksDB — экспериментальное хранилище. Исправлена проблема, связанная с отсутствием корректной проверки типов. Код упрощён. Это закрывает #19967. #19972 (alexey-milovidov).
  • Исправлена ошибка сегментации в функции fromModifiedJulianDay, когда тип аргумента — Nullable(T) для любых целочисленных типов, кроме Int32. #19959 (PHO).
  • Функция greatCircleAngle в предыдущих версиях возвращала неточные результаты. Это исправление закрывает #19769. #19789 (alexey-milovidov).
  • Исправлена редкая ошибка, из-за которой некоторые реплицируемые операции (например, мутации) не могли обрабатывать отдельные части после повреждения данных. Исправлено в #19593. #19702 (alesapin).
  • Фоновый поток, выполняющий запросы ON CLUSTER, мог зависать, ожидая какого-то действия от удалённой реплицированной таблицы. Исправлено. #19684 (yiguolei).
  • Исправлена некорректная десериализация описания столбцов. Из-за этого был невозможен INSERT в таблицу со столбцом с именем \. #19479 (alexey-milovidov).
  • Пометить распределённый батч как повреждённый, если в одном из файлов обнаружен пустой блок данных. #19449 (Azat Khuzhin).
  • Исправлена очень редкая ошибка, из-за которой мутация могла зависать после DROP/DETACH/REPLACE/MOVE PARTITION. В большинстве случаев она уже была частично исправлена в #15537. #19443 (tavplubix).
  • Исправлена возможная ошибка Extremes transform was already added to pipeline. Исправляет #14100. #19430 (Nikolai Kochetov).
  • Исправлено значение по умолчанию для типов JOIN с ненулевым значением по умолчанию (например, некоторых Enum). Закрывает #18197. #19360 (vdimir).
  • Не помечать файл распределённой отправки как повреждённый при достижении EOF. #19290 (Azat Khuzhin).
  • Исправлена утечка файлового дескриптора канала для async_socket_for_remote. #19153 (Azat Khuzhin).
  • Исправлено бесконечное чтение из файла в формате ORC (ошибка появилась в #10580). Исправлено #19095. #19134 (Nikolai Kochetov).
  • Исправлена проблема в модуле записи данных MergeTree, из-за которой размер marks мог превышать размер, заданный фиксированной granularity. Исправляет #18913. #19123 (alesapin).
  • Исправлена ошибка запуска, из-за которой ClickHouse не мог прочитать кодек сжатия из LowCardinality(Nullable(...)), что приводило к исключению Attempt to read after EOF. Исправляет #18340. #19101 (alesapin).
  • Упрощена реализация tupleHammingDistance. Добавлена поддержка кортежей любой длины при условии, что их длины совпадают. Исправлено #19029. #19084 (Nikolai Kochetov).
  • Сделано так, чтобы groupUniqArray возвращал корректный тип для аргумента типа Enum. Это закрывает #17875. #19019 (alexey-milovidov).
  • Исправлена возможная ошибка Expected single dictionary argument for function, возникающая при использовании функции ignore с аргументом LowCardinality. Исправление #14275. #19016 (Nikolai Kochetov).
  • Исправлена вставка столбца LowCardinality в таблицу с движком TinyLog. Исправление #18629. #19010 (Nikolai Kochetov).
  • Исправлена небольшая проблема в JOIN: JOIN пытается материализовать константные столбцы, но в других местах код ожидает их. #18982 (Nikita Mikhaylov).
  • Отключена настройка optimize_move_functions_out_of_any, поскольку оптимизация не всегда работает корректно. Это закрывает #18051. Это закрывает #18973. #18981 (alexey-milovidov).
  • Исправлено возможное исключение QueryPipeline stream: different number of columns, вызванное слиянием шагов Expression в плане запроса. Исправляет #18190. #18980 (Nikolai Kochetov).
  • Исправлена крайне редкая взаимоблокировка при завершении работы. #18977 (tavplubix).
  • Исправлены редкие сбои при нехватке памяти на сервере. #18976 (tavplubix).
  • Исправлено некорректное поведение, из-за которого запрос ALTER TABLE ... DROP PART 'part_name' удалял все блоки дедупликации во всей партиции. Исправление #18874. #18969 (alesapin).
  • Исправлена проблема #18894: добавлена проверка, чтобы избежать исключения, когда длинный псевдоним столбца (в формате ‘table.column’, обычно автоматически создаваемый BI-инструментами, такими как Looker) совпадает с длинным именем таблицы. #18968 (Daniel Qin).
  • Исправлена ошибка Task was not found in task queue (возможна только для удалённых запросов при async_socket_for_remote = 1). #18964 (Nikolai Kochetov).
  • Исправлена ошибка, из-за которой мутация с экранированным текстом (например, ALTER ... UPDATE e = CAST('foo', 'Enum8(\'foo\' = 1')) сериализовалась некорректно. Исправлено #18878. #18944 (alesapin).
  • ATTACH PARTITION будет сбрасывать мутации. #18804. #18935 (fastio).
  • Исправлена проблема в bitmapOrCardinality, которая может приводить к разыменованию nullptr. Закрывает #18911. #18912 (sundyli).
  • Исправлена ошибка Attempt to read after eof, возникавшая при попытке выполнить CAST значения NULL из Nullable(String) в Nullable(Decimal(P, S)). Теперь функция CAST возвращает NULL, если не удаётся разобрать десятичное число из nullable-строки. Исправлено в #7690. #18718 (Winter Zhang).
  • Исправлена проблема с преобразованием типов данных в движке MySQL. #18124 (bo zeng).
  • Исправлено исключение abort в clickhouse-client при выполнении одного только select. #19790 (taiyang-li).

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

  • Запуск SQLancer (логического SQL-фаззера) в CI. #19006 (Ilya Yatsishin).
  • Query Fuzzer будет более тщательно фаззить недавно добавленные тесты. Это закрывает #18916. #19185 (alexey-milovidov).
  • Интеграция с Big List of Naughty Strings для более эффективного фаззинга. #19480 (alexey-milovidov).
  • Добавлены интеграционные тесты, запускаемые с MSan. #18974 (alesapin).
  • Исправлены ошибки MemorySanitizer в cyrus-sasl и musl. #19821 (Ilya Yatsishin).
  • Проверка недостаточного числа аргументов в функции positionCaseInsensitiveUTF8 вызывала срабатывание address sanitizer. #19720 (alexey-milovidov).
  • Удалён --project-directory для docker-compose в интеграционном тесте. Исправлено форматирование журналов из docker-контейнера. #19706 (Ilya Yatsishin).
  • Упрощена генерация macros.xml для интеграционных тестов. Больше нет избыточного логирования от dicttoxml. Проект dicttoxml неактивен уже более 5 лет. #19697 (Ilya Yatsishin).
  • Добавлена возможность явно включать или отключать watchdog через переменную окружения CLICKHOUSE_WATCHDOG_ENABLE. По умолчанию он включён, если сервер не подключён к терминалу. #19522 (alexey-milovidov).
  • Добавлена возможность сборки ClickHouse с поддержкой Kafka на arm64. #19369 (filimonov).
  • Добавлена возможность сборки librdkafka без ssl. #19337 (filimonov).
  • Восстановлен ввод Kafka в сборках FreeBSD. #18924 (Alexandre Snarskii).
  • Исправлено потенциальное разыменование nullptr в табличной функции VALUES. #19357 (alexey-milovidov).
  • Предотвращены сообщения UBSan в функциях arrayElement, substring и arraySum. Исправляет #19305. Исправляет #19287. Это закрывает #19336. #19347 (alexey-milovidov).

Релиз ClickHouse 21.1

Релиз ClickHouse v21.1.3.32-stable, 2021-02-03

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

  • Исправлено падение из-за индекса BloomFilter. Исправление #19757. #19884 (Maksim Kita).
  • Исправлен сбой при проталкивании предикатов в подзапрос union distinct. Это исправляет #19855. #19861 (Amos Bird).
  • Исправлена фильтрация по UInt8 со значениями больше 127. #19799 (Anton Popov).
  • В предыдущих версиях нестандартные аргументы функции arrayEnumerateUniq могли вызывать сбой или приводить к бесконечному циклу. Это исправление закрывает #19787. #19788 (alexey-milovidov).
  • Исправлено переполнение стека при точном сравнении арифметического и строкового типов. #19773 (tavplubix).
  • Исправлен сбой при использовании имени вложенного столбца в WHERE или PREWHERE. Исправляет #19755. #19763 (Nikolai Kochetov).
  • Исправлена ошибка сегментации в функции bitmapAndnot. Исправление #19668. #19713 (Maksim Kita).
  • Некоторые функции с большими целыми числами могут вызывать ошибку сегментации. Поддержка больших целых чисел — экспериментальная возможность. Это исправление закрывает #19667. #19672 (alexey-milovidov).
  • Исправлен неверный результат функции neighbor для аргумента LowCardinality. Исправляет #10333. #19617 (Nikolai Kochetov).
  • Исправлено обращение к CompressedWriteBuffer после освобождения памяти в Connection после отключения. #19599 (Azat Khuzhin).
  • Запрос DROP/DETACH TABLE table ON CLUSTER cluster SYNC мог зависать; это исправлено. Исправлено #19568. #19572 (tavplubix).
  • Исправлено выражение id в запросе CREATE DICTIONARY. #19571 (Maksim Kita).
  • Исправлена ошибка SIGSEGV при значениях merge_tree_min_rows_for_concurrent_read/merge_tree_min_bytes_for_concurrent_read=0/UINT64_MAX. #19528 (Azat Khuzhin).
  • Переполнение буфера при чтении из памяти было возможно, если функция addMonth вызывалась со специально подобранными аргументами. Исправлено #19441. Исправлено #19413. #19472 (alexey-milovidov).
  • В функциях encrypt/decrypt было возможно чтение неинициализированной памяти, если в качестве IV передавалась пустая строка. Это исправляет проблему #19391. #19397 (alexey-milovidov).
  • Исправлено возможное переполнение буфера в библиотеке Uber H3. См. https://github.com/uber/h3/issues/392. Закрывает #19219. #19383 (alexey-milovidov).
  • Исправлен столбец _state в system.parts (LOGICAL_ERROR при обращении к этому столбцу из-за неверного порядка). #19346 (Azat Khuzhin).
  • Исправлены возможные неверные результаты или segfault при агрегации, когда materialized view и её целевая таблица имеют разную структуру. Исправление #18063. #19322 (tavplubix).
  • Исправлена ошибка Cannot convert column now64() because it is constant but values of constants are different in source and result. Продолжение #7156. #19316 (Nikolai Kochetov).
  • Исправлена ошибка, из-за которой одновременные запросы ALTER и DROP могли зависать при обработке таблицы ReplicatedMergeTree. #19237 (alesapin).
  • Исправлена ошибка There is no checkpoint, возникавшая при вставке данных через HTTP-интерфейс в формате Template или CustomSeparated. Исправление #19021. #19072 (tavplubix).
  • Отключена константная свёртка для подзапросов на этапе анализа, если результат не может быть вычислен. #18446 (Azat Khuzhin).
  • Мутация могла зависать, ожидая несуществующую часть после MOVE или REPLACE PARTITION, а в редких случаях — после DETACH или DROP PARTITION. Исправлено. #15537 (tavplubix).

Релиз ClickHouse v21.1.2.15-stable 2021-01-18

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

  • Настройка input_format_null_as_default теперь по умолчанию включена. #17525 (alexey-milovidov).
  • Теперь проверяются ограничения для настроек профиля из config. Server не запустится, если users.xml содержит настройки, не удовлетворяющие соответствующим ограничениям. #18486 (tavplubix).
  • Через ALTER MODIFY SETTING больше нельзя изменять настройки хранения, влияющие на части данных (write_final_mark и enable_mixed_granularity_parts). #18306 (Amos Bird).
  • По умолчанию insert_quorum_parallel установлена в 1. Это существенно удобнее, чем «последовательные» quorum-вставки. Но если вы полагаетесь на последовательную согласованность, следует вернуть значение этой настройки к нулю. #17567 (alexey-milovidov).
  • Функция sumburConsistentHash удалена. Это закрывает #18120. #18656 (alexey-milovidov).
  • Агрегатные функции timeSeriesGroupSum, timeSeriesGroupRateSum удалены, потому что один мой друг сказал, что они никогда не работали. Это исправляет #16869. Если вам все же удалось использовать эти функции, напишите письмо на feedback@clickhouse.com. #17423 (alexey-milovidov).
  • Запрещено использовать toUnixTimestamp(Date()) (раньше это просто возвращало представление Date в виде UInt16). #17376 (Azat Khuzhin).
  • Разрешено использовать расширенные целочисленные типы (Int128, Int256, UInt256) в функциях avg и avgWeighted. Также разрешено использовать разные типы (целочисленные, Decimal, с плавающей точкой) для значения и веса в функции avgWeighted. Это обратно несовместимое изменение: теперь функции avg и avgWeighted всегда возвращают Float64 (как и задокументировано). До этого изменения для аргументов Decimal возвращаемым типом тоже был Decimal. #15419 (Mike).
  • Выражение toUUID(N) больше не работает. Замените его на toUUID('00000000-0000-0000-0000-000000000000'). Это изменение вызвано неочевидными результатами toUUID(N), когда N не равен нулю.
  • SSL-сертификаты с некорректным значением “key usage” теперь отклоняются. В предыдущих версиях они работали. См. #19262.
  • Ссылки incl на файл substitutions (/etc/metrika.xml) были удалены из конфигурации по умолчанию (<remote_servers>, <zookeeper>, <macros>, <compression>, <networks>). Если вы использовали файл substitutions и полагались на эти неявные ссылки, перед обновлением их нужно вернуть вручную и явно, добавив соответствующие секции с атрибутами incl="...". См. #18740 (alexey-milovidov).

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

  • В ClickHouse реализован протокол gRPC. #15111 (Vitaly Baranov).
  • Добавлена возможность использовать несколько кластеров ZooKeeper. #17070 (fastio).
  • Реализована поддержка запросов REPLACE TABLE и CREATE OR REPLACE TABLE. #18521 (tavplubix).
  • Реализован UNION DISTINCT, а обычный оператор UNION по умолчанию рассматривается как UNION DISTINCT. Добавлена настройка union_default_mode, позволяющая рассматривать его как UNION ALL или требовать явного указания режима. #16338 (flynn).
  • Добавлена функция accurateCastOrNull. Исправление закрывает #10290. Добавлены преобразования типов в выражениях x IN (subquery). Исправление закрывает #10266. #16724 (Maksim Kita).
  • IP-словарь напрямую поддерживает типы IPv4 / IPv6. #17571 (vdimir).
  • IP-словарь поддерживает выборку по ключу. Исправлено #18241. #18480 (vdimir).
  • Добавлена поддержка сжатия и распаковки *.zst для импорта и экспорта данных. Это позволяет использовать *.zst в функции file() и Content-encoding: zstd в HTTP-клиенте. Это исправление закрывает #16791 . #17144 (Abi Palagashvili).
  • Добавлены агрегатные функции mannWitneyUTest, studentTTest и welchTTest. rankCorr слегка переработана. #16883 (Nikita Mikhaylov).
  • Добавлены функции countMatches/countMatchesCaseInsensitive. #17459 (Azat Khuzhin).
  • Реализованы countSubstrings()/countSubstringsCaseInsensitive()/countSubstringsCaseInsensitiveUTF8() (подсчёт числа вхождений подстроки). #17347 (Azat Khuzhin).
  • В system.query_log добавлена информация об используемых базах данных, таблицах и столбцах. Добавлены поля query_kind и normalized_query_hash. #17726 (Amos Bird).
  • Добавлена настройка optimize_on_insert. Когда она включена, к блоку данных, вставляемому через INSERT, применяется то же преобразование, как если бы для этого блока было выполнено слияние (например, Replacing, Collapsing, Aggregating…). Эта настройка включена по умолчанию. Это может влиять на поведение materialized view и MaterializeMySQL (см. подробное описание). Закрывает #10683. #16954 (Kruglov Pavel).
  • Аутентификация Kerberos в HDFS. #16621 (Ilya Golshtein).
  • Добавлена поддержка оператора SHOW SETTINGS для отображения параметров из system.settings. Также поддерживаются SHOW CHANGED SETTINGS и условие LIKE/ILIKE. #18056 (Jianmei Zhang).
  • Функция position теперь поддерживает синтаксис POSITION(needle IN haystack) для совместимости с SQL. Это закрывает #18701. … #18779 (Jianmei Zhang).
  • Теперь для таблиц семейства MergeTree доступна новая настройка хранилища max_partitions_to_read. Она ограничивает максимальное количество партиций, к которым можно обратиться в рамках одного запроса. Также добавлена пользовательская настройка force_max_partition_limit, позволяющая принудительно применять это ограничение. #18712 (Amos Bird).
  • Добавлен столбец query_id в system.part_log для частей, созданных при вставке. Закрывает #10097. #18644 (flynn).
  • Разрешено создание таблицы с помощью CREATE TABLE AS SELECT с указанием столбцов. Пример: CREATE TABLE t1 (x String) ENGINE = Memory AS SELECT 1;. #18060 (Maksim Kita).
  • Добавлены функции агрегации arrayMin, arrayMax, arrayAvg. #18032 (Maksim Kita).
  • Реализован запрос ATTACH TABLE name FROM 'path/to/data/' (col1 Type1, .... Он создает новую таблицу с указанной структурой и подключает к ней данные из указанного каталога в user_files. #17903 (tavplubix).
  • Добавлена поддержка мутаций в StorageMemory. Закрывает #9117. #15127 (flynn).
  • Добавлена поддержка синтаксиса EXISTS DATABASE name. #18458 (Du Chuan).
  • Добавлена поддержка встроенных функций isIPv4String && isIPv6String, как в MySQL. #18349 (Du Chuan).
  • Добавлена новая настройка insert_distributed_one_random_shard = 1, позволяющая выполнять вставку в distributed таблицу с несколькими сегментами без ключа распределения. #18294 (Amos Bird).
  • В MergeTreeSettings добавлены настройки min_compress_block_size и max_compress_block_size, которые имеют более высокий приоритет, чем глобальные настройки, и вступают в силу при их установке. Закрывает 13890. #17867 (flynn).
  • Добавлена поддержка 64-битных битмапов Roaring. #17858 (Andy Yang).
  • Расширен синтаксис OPTIMIZE ... DEDUPLICATE: теперь можно задавать явный (или неявный — со звёздочкой/трансформерами столбцов) список столбцов, по которым проверяются дубликаты. … #17846 (Vasily Nemkov).
  • Добавлены функции toModifiedJulianDay, fromModifiedJulianDay, toModifiedJulianDayOrNull и fromModifiedJulianDayOrNull. Эти функции преобразуют дату пролептического григорианского календаря в число модифицированного юлианского дня и обратно. #17750 (PHO).
  • Добавлена возможность использовать собственный список TLD: добавлены функции firstSignificantSubdomainCustom, cutToFirstSignificantSubdomainCustom. #17748 (Azat Khuzhin).
  • Добавлена поддержка протокола PROXYv1 для работы поверх нативного TCP-интерфейса. Разрешено привязывать квоты к IP-адресу, переданному прокси (применяется к адресу PROXYv1 и к X-Forwarded-For из HTTP-интерфейса). Это полезно, если вы предоставляете доступ к ClickHouse только через доверенный прокси (например, CloudFlare), но хотите учитывать ресурсы пользователей по их исходным IP-адресам. Это исправляет #17268. #17707 (alexey-milovidov).
  • Теперь clickhouse-client позволяет открывать EDITOR для редактирования команд. Alt-Shift-E. #17665 (Amos Bird).
  • Добавлена функция encodeXMLComponent для экранирования символов при вставке строки в текстовый узел или атрибут XML. #17659 (nauta).
  • Добавлен синтаксис DETACH TABLE/VIEW ... PERMANENTLY, чтобы после перезапуска таблица не появлялась снова автоматически (только по явному запросу). Таблицу по-прежнему можно повторно подключить с помощью краткого синтаксиса ATTACH TABLE. Реализует #5555. Исправляет #13850. #17642 (filimonov).
  • Добавлены асинхронные метрики общего числа строк, байтов и частей в таблицах MergeTree. Это исправление для #11714. #17639 (flynn).
  • Добавлены настройки limit и offset для пагинации вне SQL: #16176 Они полезны при построении API. Эти две настройки влияют на запрос SELECT так, как если бы к нему был добавлен select * from (your_original_select_query) t limit xxx offset xxx;. #17633 (hexiaoting).
  • Добавлен новый комбинатор агрегатных функций -SimpleState для создания типов SimpleAggregateFunction через запрос. Это полезно при определении MaterializedView на движке AggregatingMergeTree, а также будет полезно для проекций. #16853 (Amos Bird).
  • Добавлен параметр queries-file для clickhouse-client и clickhouse-local. #15930 (Maksim Kita).
  • Добавлен параметр query для clickhouse-benchmark. #17832 (Maksim Kita).
  • EXPLAIN AST теперь поддерживает не только запросы SELECT. #18136 (taiyang-li).

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

  • Добавлены функции для вычисления minHash и simHash для текстовых n-грамм и шинглов. Они предназначены для поиска частичных дубликатов. Также добавлены функции bitHammingDistance и tupleHammingDistance. #7649 (flynn).
  • Добавлен новый тип данных Map. См. #1841. Первая версия Map поддерживает только тип String для ключей и значений. #15806 (hexiaoting).
  • Реализован альтернативный SQL-парсер на базе ANTLR4 runtime, сгенерированный из грамматики EBNF. #11298 (Ivan).

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

  • Новая реализация IP-словаря с меньшим потреблением памяти, более высокой производительностью в некоторых случаях и исправленными ошибками. #16804 (vdimir).
  • Параллельное форматирование при экспорте данных. #11617 (Nikita Mikhaylov).
  • Интеграция LDAP: в конфигурацию подключения к LDAP-серверу добавлен параметр verification_cooldown, позволяющий включить кэширование успешных попыток “bind” на настраиваемый период времени. #15988 (Denis Glazachev).
  • Добавлена опция --no-system-table для clickhouse-local, позволяющая запускать его без системных таблиц. Это позволяет избежать инициализации DateLUT, которая при запуске может занимать заметное время (десятки миллисекунд). #18899 (alexey-milovidov).
  • Заменили PODArray на PODArrayWithStackMemory в AggregateFunctionWindowFunnelData, чтобы повысить производительность функции windowFunnel. #18817 (flynn).
  • Пустые блоки больше не отправляются в сегменты при синхронном INSERT в distributed таблицу. Это закрывает #14571. #18775 (alexey-milovidov).
  • Оптимизировано чтение из StorageMemory. #18052 (Maksim Kita).
  • Используется алгоритм Dragonbox вместо ryu для преобразования чисел с плавающей точкой в строки. Это значительно повышает производительность такого преобразования. #17831 (Maksim Kita).
  • Ускорена реализация функции IPv6CIDRToRange. #17569 (vdimir).
  • Добавлена настройка remerge_sort_lowered_memory_bytes_ratio (если использование памяти после remerge уменьшилось меньше чем на это значение, remerge будет отключён). #17539 (Azat Khuzhin).
  • Улучшена производительность AggregatingMergeTree с SimpleAggregateFunction(String) в первичном ключе. #17109 (Azat Khuzhin).
  • Теперь комбинатор -If девиртуализирован, а count векторизован должным образом. Это изменение из этого PR. #17043 (Amos Bird).
  • Повышена производительность чтения из таблиц Merge при работе с огромным количеством таблиц MergeTree. Исправляет #7748. #16988 (Anton Popov).
  • Повышена производительность функции repeat. #16937 (satanson).
  • Незначительно улучшена производительность парсинга чисел с плавающей запятой. #16809 (Maksim Kita).
  • Добавлена возможность пропускать уже слитые партиции при OPTIMIZE TABLE ... FINAL. #15939 (Kruglov Pavel).
  • Интеграция с fast_float от Daniel Lemire для разбора чисел с плавающей точкой. #16787 (Maksim Kita). По умолчанию не включен, так как его производительность пока ниже, чем у существующего в ClickHouse парсера чисел с плавающей точкой.
  • Исправлена проблема с max_distributed_connections (влияет на prefer_localhost_replica = 1 и max_threads != max_distributed_connections). #17848 (Azat Khuzhin).
  • Адаптивный выбор одно- или многокомпонентной загрузки при отправке данных в S3. Однокомпонентная загрузка управляется новой настройкой max_single_part_upload_size. #17934 (Pavel Kovalenko).
  • Поддержка асинхронных задач в PipelineExecutor. Первоначальная поддержка асинхронных сокетов для удалённых запросов. #17868 (Nikolai Kochetov).
  • Разрешено использовать оптимизацию optimize_move_to_prewhere с компактными частями, даже если размеры столбцов неизвестны. #17330 (Anton Popov).

Улучшение

  • Предотвращена взаимная блокировка при выполнении INSERT SELECT из таблицы в неё же для таблиц с движками TinyLog или Log. Закрывает #6802. Закрывает #18691. Закрывает #16812. Закрывает #14570. #15260 (alexey-milovidov).
  • Добавлена поддержка синтаксиса SHOW CREATE VIEW name, как в MySQL. #18095 (Du Chuan).
  • Разрешены все запросы с операцией типа Decimal * Float и наоборот, включая агрегатные (например, SELECT sum(decimal_field * 1.1) или SELECT dec_col * float_col); тип результата — Float32 или Float64. #18145 (Mike).
  • Улучшен минималистичный веб-интерфейс: добавлена история; добавлена поддержка общего доступа; устранена гонка при обработке разных запросов; добавлены индикаторы выполнения запроса и готовности; добавлен favicon; добавлено распознавание Ctrl+Enter, если textarea не в фокусе. #17293 #17770 (alexey-milovidov).
  • clickhouse-server не отправлял запрос close на сервер ZooKeeper. #16837 (alesapin).
  • Предотвращено аварийное завершение работы сервера при слишком низких лимитах памяти (max_memory_usage = 1 / max_untracked_memory = 1). #17453 (Azat Khuzhin).
  • Исправлен недетерминированный результат функции windowFunnel в случае одинаковых временных меток у разных событий. #18884 (Fuwang Hu).
  • Docker: Явно заданы uid/gid пользователя и группы clickhouse как фиксированные значения (101) в Docker-образах clickhouse-server. #19096 (filimonov).
  • Асинхронные INSERT в таблицы Distributed: добавлены две новые настройки (по аналогии с семейством MergeTree): - fsync_after_insert - Выполнять fsync после каждой вставки. Это снизит производительность вставок. - fsync_directories - Выполнять fsync для временного каталога (который используется только для асинхронного INSERT) после всех операций (записи, переименования и т. д.). #18864 (Azat Khuzhin).
  • Команда SYSTEM KILL теперь работает в Docker. Это закрывает #18847. #18848 (alexey-milovidov).
  • Подстановка макросов в пути zk при выполнении FETCH PARTITION. #18839 (fastio).
  • Применяйте ALTER TABLE <replicated_table> ON CLUSTER MODIFY SETTING ... ко всем репликам, поскольку такие команды ALTER не реплицируются. #18789 (Amos Bird).
  • Разрешено преобразователю столбцов EXCEPT принимать строку в качестве шаблона регулярного выражения. Это решает проблему #18685 . #18699 (Amos Bird).
  • Исправлена SimpleAggregateFunction в SummingMergeTree. Теперь она работает как AggregateFunction. В предыдущих версиях значения суммировались независимо от агрегатной функции. Это исправляет #18564. #8052. #18637 (Amos Bird). Ещё одно исправление, связанное с использованием SimpleAggregateFunction в SummingMergeTree. Это исправляет #18676. #18677 (Amos Bird).
  • Исправлена ошибка assert внутри аллокатора, возникавшая, если последний аргумент функции bar равен NaN. Теперь вместо неё генерируется обычное исключение ClickHouse. Это исправляет #17876. #18520 (Nikita Mikhaylov).
  • Исправлена проблема: в некоторых инструментах после сообщения об исключении не было перевода строки. #18444 (alexey-milovidov).
  • Добавлена возможность изменять тип столбца первичного ключа и ключа партиционирования с LowCardinality(Type) на Type и наоборот. Также добавлена возможность изменять тип столбца первичного ключа с EnumX на IntX. Исправляет #5604. #18362 (alesapin).
  • Реализован доступ к полям функции untuple. #18133. #18309 (hexiaoting).
  • Разрешён разбор полей Array из CSV, если они представлены строкой, содержащей массив, сериализованный как вложенный CSV. Пример: "[""Hello"", ""world"", ""42"""" TV""]" будет разобран как ['Hello', 'world', '42" TV']. Разрешён разбор массива в CSV из строки без внешних скобок. Пример: "'Hello', 'world', '42"" TV'" будет разобран как ['Hello', 'world', '42" TV']. #18271 (alexey-milovidov).
  • Улучшен расчёт адаптивной гранулярности для широких частей MergeTree. #18223 (alesapin).
  • Теперь clickhouse install может работать и на Mac. Проблема была в том, что на этой платформе нет procfs. #18201 (Nikita Mikhaylov).
  • Более понятные подсказки по синтаксису запроса SHOW .... #18183 (Du Chuan).
  • Поддержка агрегирования массивов arrayMin, arrayMax, arraySum, arrayAvg для Int128, Int256, UInt256. #18147 (Maksim Kita).
  • В настройки хранилища Set и Join добавлен disk. #18112 (Grigory Pervakov).
  • Управление доступом: теперь table function merge() требует, чтобы текущий пользователь имел привилегию SELECT для каждой таблицы, из которой она получает данные. Этот PR исправляет #16964. #18104 #17983 (Vitaly Baranov).
  • Временные таблицы теперь видны в системных таблицах system.tables и system.columns только в тех сеансах, где они были созданы. Внутренняя база данных _temporary_and_external_tables теперь скрыта в этих системных таблицах; вместо неё временные таблицы отображаются как таблицы с пустой базой данных и установленным флагом is_temporary. #18014 (Vitaly Baranov).
  • Исправлена проблема с отображением clickhouse-client при изменении размера окна терминала. #18009 (Amos Bird).
  • Снижена подробность логирования событий при разрыве соединения клиентом: с Warning до Information. #18005 (filimonov).
  • Принудительное удаление пустых или повреждённых файлов метаданных из файловой системы для DiskS3. S3 — экспериментальная возможность. #17935 (Pavel Kovalenko).
  • Управление доступом: allow_introspection_functions=0 запрещает использование функций интроспекции, но больше не запрещает выдавать для них привилегии (получателю привилегии нужно будет установить для себя allow_introspection_functions=1, чтобы иметь возможность использовать эту привилегию). Аналогично, allow_ddl=0 запрещает использование команд DDL, но больше не запрещает выдавать для них привилегии. #17908 (Vitaly Baranov).
  • Улучшение юзабилити: подсказки для имён столбцов. #17112. #17857 (fastio).
  • Добавлена диагностическая информация на случай, когда две таблицы Merge пытаются читать данные друг друга. #17854 (徐炘).
  • Добавлена возможность переопределять тайм-аут запускаемого скрипта при использовании Docker-образа ClickHouse. #17818 (Guillaume Tassery).
  • Проверка грамматики определения движка системных таблиц логов помогает предотвратить некоторые ошибки конфигурации. Обратите внимание, что эта проверка не семантическая, то есть такие ошибки, как несуществующие столбцы / функции в выражениях, не будут обнаружены, пока таблица не будет создана. #17739 (Du Chuan).
  • Исключение при инициализации таблицы RabbitMQ больше не генерируется, если соединение отсутствует (повторное подключение будет выполняться в фоновом режиме). #17709 (Kseniia Sumarokova).
  • Не игнорируйте ограничения памяти сервера при сбросе Buffer. #17646 (Azat Khuzhin).
  • Переход на пропатченную версию RocksDB (из ClickHouse-Extras) для устранения ошибки use-after-free. #17643 (Nikita Mikhaylov).
  • В сообщение об исключении при параллельном парсинге добавлено смещение. Это исправляет #17457. #17641 (Nikita Mikhaylov).
  • Не генерировать ошибку “Too many parts” в середине запроса INSERT. #17566 (alexey-milovidov).
  • В операторе UPDATE запроса ALTER теперь разрешены параметры запроса. Исправляет #10976. #17563 (alexey-milovidov).
  • Обфускатор запросов: избегать использования некоторых ключевых слов SQL в качестве имён идентификаторов. #17526 (alexey-milovidov).
  • Экспорт текущей максимальной DDL-записи, выполненной DDLWorker, через метрику сервера. Полезно для проверки, не завис ли DDLWorker где-либо. #17464 (Amos Bird).
  • Экспорт асинхронных метрик текущих потоков на всех серверах. Это полезно для поиска проблем вроде этой. #17463 (Amos Bird).
  • В запрос с подстановочным знаком включаются столбцы MATERIALIZED / ALIAS, если включены настройки asterisk_include_materialized_columns и asterisk_include_alias_columns. #17462 (Ken Chen).
  • Добавлена возможность задавать TTL для удаления старых записей из системных таблиц логов с помощью атрибута <ttl> в config.xml. #17438 (Du Chuan).
  • Теперь запросы, поступающие на сервер по протоколам MySQL и PostgreSQL, имеют отдельные типы интерфейса (их можно увидеть в столбце interface таблицы system.query_log): 4 для MySQL и 5 для PostgreSQL вместо ранее использовавшегося 1, который теперь используется только для собственного протокола. #17437 (Vitaly Baranov).
  • Исправлен разбор секции SETTINGS в запросе INSERT ... SELECT ... SETTINGS. #17414 (Azat Khuzhin).
  • Исправлен учёт памяти в RadixSort. #17412 (Nikita Mikhaylov).
  • Добавлена проверка на eof в receiveHello на сервере, чтобы избежать исключения Attempt to read after eof. #17365 (Kruglov Pavel).
  • Предотвращено возможное переполнение стека при преобразовании bigint. Большие целые числа имеют экспериментальный статус. #17269 (flynn).
  • Теперь индексы set будут поддерживать GLOBAL IN. Это исправляет #17232, #5576. #17253 (Amos Bird).
  • Добавлено ограничение на количество HTTP-перенаправлений в запросах к хранилищу S3 (s3_max_redirects). #17220 (ianton-ru).
  • Если комбинатор -OrNull используется вместе с комбинаторами -If, -Merge, -MergeState, -State, его следует ставить перед ними. #16935 (flynn).
  • Поддержка HTTP-прокси и настройки конечной точки S3 по HTTPS. #16861 (Pavel Kovalenko).
  • Добавлена корректная аутентификация клиента S3 через переменные окружения, ~/.aws и AssumeRole. #16856 (Vladimir Chebotarev).
  • Добавлены дополнительные спаны OpenTelemetry. Добавлен пример экспорта данных спана в Zipkin. #16535 (Alexander Kuzmenkov).
  • Словари cache: полностью устранены обратные вызовы и блокировки при доступе к ним. Ключи не разделяются на “не найденные” и “истёкшие”, а хранятся в одной map в ходе запроса. #14958 (Nikita Mikhaylov).
  • Исправлена экспериментальная возможность fsync_part_directory/fsync_after_insert/in_memory_parts_insert_sync, которая раньше никогда не работала. #18845 (Azat Khuzhin).
  • Разрешено использовать Atomic как движок вложенной базы данных для MaterializeMySQL. #14849 (tavplubix).

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

  • Исправлена проблема, из-за которой сервер в очень редких случаях мог перестать принимать соединения. #17542 (Amos Bird, alexey-milovidov).
  • Исправлен анализ индексов для бинарных функций с константным аргументом, из-за которого запрос мог возвращать неверные результаты. Это исправление для #18364. #18373 (Amos Bird).
  • Исправлен возможный некорректный анализ индекса, когда в сравнении по индексу используются разные типы. Это исправляет #17122. #17145 (Amos Bird).
  • Отключена запись через AIO при выполнении слияний, поскольку в крайне редких случаях это может приводить к повреждению данных в столбцах первичного ключа. #18481 (alesapin).
  • Ограничены слияния из wide в compact части. В случае Вертикального слияния это приводило к повреждению результирующей части. #18381 (Anton Popov).
  • Исправлен возможный неполный результат запроса при чтении из MergeTree* в случае задержки при чтении (сообщение <Debug> MergeTreeReadPool: Will lower number of threads в журнале). Добавлено в #16423. Исправляет #18137. #18216 (Nikolai Kochetov).
  • Исправлена ошибка use-after-free в библиотеке rocksdb. #18862 (sundyli).
  • Исправлено бесконечное чтение из файла в формате ORC (ошибка появилась в #10580). Исправлено #19095. #19134 (Nikolai Kochetov).
  • Исправлена ошибка в модуле записи данных MergeTree, из-за которой размер marks мог превышать фиксированный размер гранулярности. Исправляет #18913. #19123 (alesapin).
  • Исправлена ошибка при запуске, из-за которой ClickHouse не мог прочитать кодек сжатия из LowCardinality(Nullable(...)) и генерировал исключение Attempt to read after EOF. Исправление #18340. #19101 (alesapin).
  • Ограничено выполнение запросов MODIFY TTL для таблиц MergeTree, созданных с использованием старого синтаксиса. Ранее запрос выполнялся успешно, но фактически ни на что не влиял. #19064 (Anton Popov).
  • Исправлено: groupUniqArray возвращает корректный тип для аргумента типа enum. Это закрывает #17875. #19019 (alexey-milovidov).
  • Исправлена возможная ошибка Expected single dictionary argument for function при использовании функции ignore с аргументом LowCardinality. Исправление #14275. #19016 (Nikolai Kochetov).
  • Исправлена вставка столбца LowCardinality в таблицу с движком TinyLog. Исправлена ошибка #18629. #19010 (Nikolai Kochetov).
  • JOIN пытается материализовать константные столбцы, но наш код ожидает их в других местах. #18982 (Nikita Mikhaylov).
  • Отключена optimize_move_functions_out_of_any, поскольку эта оптимизация не всегда работает корректно. Это закрывает #18051. Это закрывает #18973. #18981 (alexey-milovidov).
  • Исправлено возможное исключение QueryPipeline stream: different number of columns, вызванное слиянием шагов Expression в плане запроса. Исправление #18190. #18980 (Nikolai Kochetov).
  • Исправлена крайне редкая взаимная блокировка при завершении работы. #18977 (tavplubix).
  • Исправлено некорректное поведение, при котором запрос ALTER TABLE ... DROP PART 'part_name' удалял все блоки дедупликации во всей партиции. Исправление #18874. #18969 (alesapin).
  • При Attach партиции мутация должна сбрасываться. #18804. #18935 (fastio).
  • Исправлена ошибка в bitmapOrCardinality, которая может привести к разыменованию nullptr. Закрывает #18911. #18912 (sundyli).
  • Исправлено возможное зависание при завершении работы clickhouse-local. Это устраняет проблему #18891. #18893 (alexey-milovidov).
  • Запросы к внешним базам данных (MySQL, ODBC, JDBC) некорректно переписывались, если содержали выражение вида x IN table. Это исправление для #9756. #18876 (alexey-milovidov).
  • Исправлен комбинатор *If для унарной функции и типов Nullable. #18806 (Azat Khuzhin).
  • Исправлена проблема, из-за которой асинхронные распределённые INSERT могли отклоняться сервером, если параметр network_compression_method глобально установлен в значение, отличное от значения по умолчанию. Это исправление устраняет #18741. #18776 (alexey-milovidov).
  • Исправлена ошибка Attempt to read after eof при попытке выполнить CAST NULL из Nullable(String) в Nullable(Decimal(P, S)). Теперь функция CAST возвращает NULL, если не удаётся разобрать десятичное число из nullable-строки. Исправлено в #7690. #18718 (Winter Zhang).
  • Исправлена незначительная проблема с логированием. #18717 (sundyli).
  • Исправлена проблема с удалением пустых частей в таблицах ReplicatedMergeTree, созданных по старому синтаксису. Исправляет #18582. #18614 (Anton Popov).
  • Исправлена ошибка, связанная с переполнением даты при различных значениях. Для типа Date жёстко задан предел значения “2106-02-07”; дата > “2106-02-07” приводится к значению 0. #18565 (hexiaoting).
  • Добавлена поддержка типа данных FixedString при репликации из MySQL. Репликация из MySQL — экспериментальная возможность. Этот патч исправляет #18450, а также #6556. #18553 (awesomeleo).
  • Исправлена возможная ошибка Pipeline stuck, возникавшая при использовании ORDER BY после подзапроса с RIGHT или FULL JOIN. #18550 (Nikolai Kochetov).
  • Исправлена ошибка, которая могла приводить к зависанию запросов ALTER после принудительного завершения соответствующей мутации. Обнаружено с помощью thread fuzzer. #18518 (alesapin).
  • Добавлена корректная поддержка 12AM в функции parseDateTimeBestEffort. Это исправляет #18402. #18449 (vladimir-golovchenko).
  • Исправлена ошибка value is too short при выполнении функций toType(...) (toDate, toUInt32 и т. д.) с аргументом типа Nullable(String). Теперь такие функции возвращают NULL при ошибках разбора вместо того, чтобы сгенерировать исключение. Исправляет #7673. #18445 (tavplubix).
  • Исправлено некорректное поведение SHOW TABLES. #18431 (fastio).
  • Исправлено: комбинатор -SimpleState создавал несовместимые типы аргумента и возвращаемого значения. #18404 (Amos Bird).
  • Исправлено возможное состояние гонки при одновременном использовании таблиц Set или Join и выполнении запросов к system.tables. #18385 (alexey-milovidov).
  • Исправлено заполнение таблицы system.settings_profile_elements. Этот PR устраняет проблему #18231. #18379 (Vitaly Baranov).
  • Исправлены возможные сбои в работе агрегатных функций с комбинатором Distinct при использовании двухуровневой агрегации. Исправление #17682. #18365 (Anton Popov).
  • Исправлена проблема, из-за которой процесс clickhouse-odbc-bridge был недоступен серверу на машинах с двойным стеком IPv4/IPv6; исправлена проблема, из-за которой обновления ODBC-словаря выполнялись с использованием некорректных запросов и/или приводили к сбоям процесса odbc-bridge; возможно, закрывает #14489. #18278 (Denis Glazachev).
  • Управление доступом: SELECT count() FROM table теперь можно выполнить, если у пользователя есть доступ хотя бы к одному столбцу таблицы. Этот PR исправляет #10639. #18233 (Vitaly Baranov).
  • Управление доступом: для SELECT JOIN теперь требуется привилегия SELECT на каждую из объединяемых таблиц. Этот PR исправляет #17654. #18232 (Vitaly Baranov).
  • Исправлено сравнение ключей для типов Enum и Int. Это устраняет проблему #17989. #18214 (Amos Bird).
  • Репликация из MySQL (экспериментальная возможность). Исправлена ошибка #18186 Исправлена ошибка #16372 Исправлена проблема с преобразованием уникального ключа в движке базы данных MaterializeMySQL. #18211 (Winter Zhang).
  • Исправлена некорректность в запросах, использующих одновременно WITH FILL и WITH TIES #17466. #18188 (hexiaoting).
  • Исправлена вставка строки со значением по умолчанию при ошибке разбора в последнем столбце. Исправляет #17712. #18182 (Jianmei Zhang).
  • Исправлена ошибка Unknown setting profile, возникавшая при попытке задать профиль настроек. #18167 (tavplubix).
  • Исправлена ошибка, из-за которой запрос MODIFY COLUMN ... REMOVE TTL фактически не удалял TTL для столбца. #18130 (alesapin).
  • Исправлена ошибка std::out_of_range: basic_string при разборе URL S3. #18059 (Vladimir Chebotarev).
  • Исправлено сравнение DateTime64 и Date. Исправлены #13804 и #11222. … #18050 (Vasily Nemkov).
  • Репликация из MySQL (экспериментальная возможность): исправлены #15187 и #17912, добавлена поддержка преобразования префиксного индекса MySQL для MaterializeMySQL. #17944 (Winter Zhang).
  • Когда ротация журналов сервера была настроена с помощью параметра logger.size и его числовое значение превышало 2^32, ротация журналов выполнялась некорректно. Это исправлено. #17905 (Alexander Kuzmenkov).
  • Тривиальная оптимизация запроса приводила к неверному результату, если запрос содержал ARRAY JOIN (то есть на самом деле запрос нетривиален). #17887 (sundyli).
  • Исправлен возможный segfault в агрегатной функции topK. Закрывает #17404. #17845 (Maksim Kita).
  • WAL (экспериментальная возможность): Не восстанавливать части из WAL, если in_memory_parts_enable_wal отключен. #17802 (detailyang).
  • Сообщение об исключении о максимальном размере удаляемой таблицы отображалось некорректно. #17764 (alexey-milovidov).
  • Исправлена возможная ошибка сегментации при вставке в таблицу Distributed, если не хватает места. #17737 (tavplubix).
  • Исправлена проблема, из-за которой ClickHouse не мог возобновить соединение с серверами MySQL. #17681 (Alexander Kazakov).
  • Windows: исправлена ошибка Function not implemented, возникавшая при выполнении запроса RENAME в базе данных Atomic, когда ClickHouse работает в Windows Subsystem for Linux. Исправление #17661. #17664 (tavplubix).
  • Это могло определяться некорректно при выполнении запроса ON CLUSTER, если кластер был реплицирован по кольцу (перекрёстно) или нет, из-за состояния гонки, когда pool_size > 1. Это исправлено. #17640 (tavplubix).
  • Устранена проблема с пустой таблицей system.stack_trace при работе сервера в режиме демона. #17630 (Amos Bird).
  • Исключение fmt::v7::format_error теперь может записываться в журнал в фоновом режиме для таблиц MergeTree. Это исправляет #17613. #17615 (alexey-milovidov).
  • Когда clickhouse-client использовался в интерактивном режиме с многострочными запросами, однострочный комментарий по ошибке распространялся до конца запроса. Это исправление устраняет проблему #13654. #17565 (alexey-milovidov).
  • Исправлено зависание ALTER-запроса, когда соответствующая мутация была прервана на другой реплике. Исправлена проблема #16953. #17499 (alesapin).
  • Исправлена проблема с учётом использования памяти, когда ClickHouse занижал размер кэша меток. Это может происходить при наличии большого количества очень маленьких файлов с метками. #17496 (alesapin).
  • Исправлена ошибка в ORDER BY при включенной настройке optimize_redundant_functions_in_order_by. #17471 (Anton Popov).
  • Исправлены дубликаты после DISTINCT, которые могли появляться из-за некорректной оптимизации. Исправлено в #17294. #17296 (li chengxiang). #17439 (Nikolai Kochetov).
  • Устранена высокая загрузка CPU в фоновых задачах таблиц семейства *MergeTree. #17416 (tavplubix).
  • Исправлен возможный сбой при чтении из таблицы JOIN с типами LowCardinality. Исправление #17228. #17397 (Nikolai Kochetov).
  • Репликация из MySQL (экспериментальная возможность): исправление #16835 — попытка устранить несоответствие заголовка в операторе MySQL SHOW. #17366 (Winter Zhang).
  • Исправлена работа недетерминированных функций в оптимизаторе предикатов. Это исправляет #17244. #17273 (Winter Zhang).
  • Исправлена возможная ошибка Unexpected packet Data received from client в распределённых запросах с LIMIT. #17254 (Azat Khuzhin).
  • Исправлена инвалидация индекса Set при наличии константных столбцов в подзапросе. Это исправляет #17246. #17249 (Amos Bird).
  • clickhouse-copier: Исправлена работа с непартиционированными таблицами #15235. #17248 (Qi Chen).
  • Исправлена возможная неработоспособность мутаций для частей, хранящихся на диске S3 (экспериментальная возможность). #17227 (Pavel Kovalenko).
  • Исправлена ошибка в функции fuzzBits, связанная с проблемой: #16980. #17051 (hexiaoting).
  • Исправлено optimize_distributed_group_by_sharding_key для запроса, содержащего только OFFSET. #16996 (Azat Khuzhin).
  • Исправлена работа JOIN-запросов из таблиц Merge поверх таблиц Distributed. #16993 (Azat Khuzhin).
  • Исправлена оптимизация ORDER BY для монотонных функций. Исправление #16107. #16956 (Anton Popov).
  • Исправлено некорректное сравнение типов DateTime64 с разным масштабом. Исправляет #16655#16952 (Vasily Nemkov).
  • Исправлена оптимизация group by при использовании JOIN и включенной настройке optimize_aggregators_of_group_by_keys. Исправляет #12604. #16951 (Anton Popov).
  • Небольшое исправление запроса SHOW ACCESS. #16866 (tavplubix).
  • Исправлено поведение при включенной настройке optimize_trivial_count_query при использовании предиката партиции. #16767 (Azat Khuzhin).
  • Возвращается число затронутых строк для запросов INSERT через протокол MySQL. Ранее ClickHouse всегда возвращал 0; теперь это исправлено. Исправляет #16605. #16715 (Winter Zhang).
  • Исправлено некорректное поведение, вызванное select_sequential_consistency, в оптимизированном тривиальном запросе подсчета и системных таблицах. #16309 (Hao Chen).
  • Генерировать ошибку, если преобразователь столбцов REPLACE применяется к несуществующему столбцу. #16183 (hexiaoting).
  • Генерировать исключение, если выражение ON в RIGH|FULL JOIN не является эквисоединением. #15162 (Artem Zuikov).

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

  • Добавлена простая проверка целостности бинарного файла ClickHouse. Она позволяет выявлять повреждения, вызванные неисправным оборудованием (например, порчей данных на носителях или случайным изменением битов в оперативной памяти). #18811 (alexey-milovidov).
  • Заменён OpenSSL на BoringSSL. Это позволяет избежать проблем с санитайзерами. Исправлены #12490, #17502 и #12952. #18129 (alexey-milovidov).
  • Упростили скрипт инициализации Sys/V. Он не работал в Ubuntu 12.04 и более ранних версиях. #17428 (alexey-milovidov).
  • Несколько улучшений в скрипте ./clickhouse install. #17421 (alexey-milovidov).
  • Теперь ClickHouse может выступать в роли псевдо-ZooKeeper. Сейчас реализация хранилища — это просто хеш-таблица в памяти, а server частично поддерживает протокол ZooKeeper. #16877 (alesapin).
  • Исправлено удаление устаревших наблюдений списка в TestKeeperStorage (мок-объекте для ZooKeeper). #18065 (alesapin).
  • Добавлена команда SYSTEM SUSPEND для моделирования сбоев. Её можно использовать для упрощения тестов переключения при отказе. Это закрывает #15979. #18850 (alexey-milovidov).
  • Генерировать build id при компоновке ClickHouse с lld. Оказалось, что lld не генерирует его по умолчанию на моей машине. Build id используется для отчётов о сбоях и диагностики. #18808 (alexey-milovidov).
  • Исправлены ошибки ShellCheck при проверке стиля. #18566 (Ilya Yatsishin).
  • Информация о часовых поясах обновлена до версии 2020e. #18531 (alesapin).
  • Исправлены предупреждения codespell. Проверки стиля разбиты на отдельные части. Обновлён Docker-образ для проверок стиля. #18463 (Ilya Yatsishin).
  • Автоматическая проверка на наличие в документации оставшихся маркеров конфликта. #18332 (alexey-milovidov).
  • Для проверки тестов без сохранения состояния на нестабильность включён Thread Fuzzer. #18299 (alesapin).
  • Не используйте функцию strerror, не являющуюся потокобезопасной. #18204 (alexey-milovidov).
  • Обновлено действие workflow anchore/scan-action@main (перенесено с master на main). #18192 (Stig Bakken).
  • Теперь clickhouse-test выполняет операции DROP/CREATE баз данных с тайм-аутом. #18098 (alesapin).
  • Добавлена экспериментальная поддержка фреймворка Pytest для тестов без сохранения состояния. #17902 (Ivan).
  • Теперь в интеграционных тестах используется новая версия демона Docker. #17671 (alesapin).
  • Отправлять сведения об официальной сборке, объёме памяти, CPU и свободном месте на диске в Sentry, если он включен. Sentry — это опциональная возможность, призванная помочь разработчикам ClickHouse. Это закрывает #17279. #17543 (alexey-milovidov).
  • В коде clickhouse-copier использовалась неинициализированная переменная. #17363 (Nikita Mikhaylov).
  • Исправлен один отчёт MSan по #17309. #17344 (Nikita Mikhaylov).
  • Исправлена проблема с IPv6 в библиотеке Arrow Flight. Подробности см. в комментариях. #16664 (Zhanna).
  • Добавлена библиотека, заменяющая некоторые функции libc на ловушки, которые приводят к завершению процесса. #16366 (alexey-milovidov).
  • Добавлена диагностическая информация в серверный журнал на случай переполнения стека; сообщение об ошибке отправляется в clickhouse-client. Это закрывает #14840. #16346 (alexey-milovidov).
  • Теперь почти все функциональные тесты без сохранения состояния можно запускать параллельно. #15236 (alesapin).
  • Исправлено повреждение данных при распаковке snappy в librdkafka (проблема возникала только в сборках с gcc10, но официальные сборки уже используют clang, поэтому по крайней мере недавние официальные релизы не затронуты). #18053 (Azat Khuzhin).
  • Если сервер был завершён OOM killer, в журнал выводится сообщение. #13516 (alexey-milovidov).
  • PODArray: Предотвращён вызов memcpy с аргументами (nullptr, 0) (исправлен отчёт UBSan). Это исправляет #18525. #18526 (alexey-milovidov).
  • Небольшое улучшение при объединении путей ZooKeeper внутри DDLWorker. #17767 (Bharat Nallan).
  • Добавлена возможность перезагружать символы из отладочного файла. Этот PR также исправляет проблему с build-id. #17637 (Amos Bird).
Последнее изменение 10 июня 2026 г.