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

Журнал изменений v24.10 для ClickHouse Cloud

Актуальные изменения для сервисов ClickHouse Cloud на основе релиза v24.10.

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

  • Разрешена запись SETTINGS перед FORMAT в цепочке запросов с UNION, если подзапросы заключены в круглые скобки. Это закрывает #39712. Изменено поведение, когда в запросе секция SETTINGS указывается дважды подряд. Ближайшая секция SETTINGS будет иметь приоритет для соответствующего подзапроса. В предыдущих версиях внешняя секция SETTINGS могла иметь приоритет над внутренней. #60197 #68614 (Alexey Milovidov).
  • Пере реализован тип Dynamic. Теперь, когда достигается предел динамических типов данных, новые типы не приводятся к String, а хранятся в специальной структуре данных в бинарном формате с бинарно закодированным типом данных. Теперь любой тип, когда-либо вставленный в столбец Dynamic, может быть прочитан из него как подстолбец. #68132 (Pavel Kruglov).
  • Выражения вида a[b].c поддерживаются для именованных кортежей, а также именованные обращения из произвольных выражений, например, expr().name. Это полезно для обработки JSON. Это закрывает #54965. В предыдущих версиях выражение вида expr().name разбиралось как tupleElement(expr(), name), и анализатор запросов искал столбец name, а не соответствующий элемент кортежа; в новой версии это изменено на tupleElement(expr(), 'name'). В большинстве случаев предыдущая версия не работала, но можно представить себе очень необычный сценарий, когда это изменение могло привести к несовместимости: если вы хранили имена элементов кортежа в столбце или псевдониме, имя которого отличалось от имени элемента кортежа: SELECT 'b' AS a, CAST([tuple(123)] AS 'Array(Tuple(b UInt8))') AS t, t[1].a. Маловероятно, что вы использовали такие запросы, но мы всё же должны пометить это изменение как потенциально несовместимое с предыдущими версиями. #68435 (Alexey Milovidov).
  • Когда настройка print_pretty_type_names включена, тип данных Tuple будет выводиться в удобочитаемом виде в операторах SHOW CREATE TABLE, функции formatQuery, а также в интерактивном режиме в clickhouse-client и clickhouse-local. В предыдущих версиях эта настройка применялась только к запросам DESCRIBE и toTypeName. Это закрывает #65753. #68492 (Alexey Milovidov).
  • Перестановка условий фильтра из секции [PRE]WHERE теперь по умолчанию разрешена. Её можно отключить, установив allow_reorder_prewhere_conditions в false. #70657 (Nikita Taranov).
  • Исправлена оптимизация optimize_functions_to_subcolumns (ранее могла приводить к ошибке Invalid column type for ColumnUnique::insertRangeFrom. Expected String, got LowCardinality(String)), путём сохранения типа LowCardinality в mapKeys/mapValues. #70716 (Azat Khuzhin).

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

  • Обновляемые материализованные представления готовы к промышленной эксплуатации. #70550 (Michael Kolupaev). Обновляемые материализованные представления теперь поддерживаются в реплицируемых базах данных. #60669 (Michael Kolupaev).
  • Функция toStartOfInterval() теперь имеет новую перегрузку, которая эмулирует функцию TimescaleDB time_bucket(), а также функцию PostgreSQL date_bin() (#55619). Она позволяет выравнивать значения даты или временной метки по кратным заданному интервалу от произвольной точки отсчёта (вместо 0000-01-01 00:00:00.000 как фиксированной точки отсчёта). Например, SELECT toStartOfInterval(toDateTime('2023-01-01 14:45:00'), INTERVAL 1 MINUTE, toDateTime('2023-01-01 14:35:30')); возвращает 2023-01-01 14:44:30, которое кратно интервалу в 1 минуту, начиная от точки отсчёта 2023-01-01 14:35:30. #56738 (Yarik Briukhovetskyi).
  • Полностью переработана интеграция с MongoDB: выполнена миграция на новый драйвер mongocxx с устаревшего Poco::MongoDB, удалена поддержка устаревшего протокола, добавлена поддержка подключения по URI, обеспечена поддержка всех типов MongoDB, а также операторов WHERE и ORDER BY на стороне MongoDB, введены ограничения для выражений, не поддерживаемых MongoDB. #63279 (Kirill Nikiforov).
  • Новая опция --progress-table в clickhouse-client выводит таблицу с метриками, которые изменяются во время выполнения запроса; новая опция --enable-progress-table-toggle связана с опцией --progress-table и переключает отображение таблицы прогресса при нажатии сочетания клавиш Ctrl+Space. #63689 (Maria Khristenko).
  • Это позволяет предоставлять доступ к префиксам с подстановочными символами (wildcard). GRANT SELECT ON db.table_pefix_* TO user. #65311 (pufit).
  • Добавлен формат JSONCompactWithProgress, в котором ClickHouse выводит каждую строку как отдельный JSON-объект в новой строке, включая метаданные, данные, прогресс, итоги и статистику. #66205 (Alexey Korepanov).
  • Добавлен system.query_metric_log, который содержит историю значений памяти и метрик из таблицы system.events для отдельных запросов и периодически сбрасывает её на диск. #66532 (Pablo Marcos).
  • Добавлена настройка input_format_json_empty_as_default, которая, если включена, рассматривает пустые поля во входных JSON-данных как значения по умолчанию. Закрывает #59339. #66782 (Alexis Arnaud).
  • Добавлены функции overlay и overlayUTF8, которые заменяют части строки на другую строку. Пример: SELECT overlay('Hello New York', 'Jersey', 11) возвращает Hello New Jersey. #66933 (李扬).
  • Добавлена новая команда легковесного удаления в партиции DELETE FROM [db.]table [ON CLUSTER cluster] [IN PARTITION partition_expr] WHERE expr; ``` VM-114-29-tos :) select * from ads_app_poster_ip_source_channel_di_replicated_local;. #67805 (sunny).
  • Реализовано сравнение значений типа данных Interval, поэтому теперь они приводятся к наименьшему общему супертипу. #68057 (Yarik Briukhovetskyi).
  • Добавлена настройка create_if_not_exists, которая по умолчанию включает поведение IF NOT EXISTS для операторов CREATE. #68164 (Peter Nguyen).
  • Добавляет возможность читать таблицы Iceberg в Azure и локально. #68210 (Daniil Ivanik).
  • Добавлены агрегатные функции distinctDynamicTypes/distinctJSONPaths/distinctJSONPathsAndTypes для более удобной интроспекции содержимого столбцов JSON по типам. #68463 (Pavel Kruglov).
  • Теперь записи кэша запросов можно удалять по тегу. Например, запись кэша запросов, созданная запросом SELECT 1 SETTINGS use_query_cache = true, query_cache_tag = 'abc', может быть удалена командой SYSTEM DROP QUERY CACHE TAG 'abc' (или, разумеется, просто: SYSTEM DROP QUERY CACHE, что очистит весь кэш запросов). #68477 (Michał Tabaszewski).
  • Простой запрос SELECT можно записать с использованием неявного SELECT, чтобы выполнять вычисления в стиле калькулятора, например, ch "1 + 2". Это контролируется новым параметром implicit_select. #68502 (Alexey Milovidov).
  • Добавлена поддержка режима --copy для clickhouse local как упрощённого способа конвертации форматов #68503. #68583 (Denis Hananein).
  • Добавлена функция ripeMD160, которая вычисляет криптографический хеш RIPEMD-160 от строки. Пример: SELECT hex(ripeMD160('The quick brown fox jumps over the lazy dog')) возвращает 37F332F68DB77BD9D7EDD4969571AD671CF9DD3B. #68639 (Dergousov Maxim).
  • Добавлен виртуальный столбец _headers для движка таблицы URL. Закрывает #65026. #68867 (flynn).
  • Добавлена таблица system.projections для отслеживания доступных проекций. #68901 (Jordi Villar).
  • Добавлена поддержка функции arrayUnion. #68989 (Peter Nguyen).
  • Добавлена новая функция arrayZipUnaligned для совместимости со Spark (arrays_zip), которая допускает массивы разной длины на базе существующей функции arrayZip. ``` sql SELECT arrayZipUnaligned([1], [1, 2, 3]). #69030 (李扬).
  • Поддержана агрегатная функция quantileExactWeightedInterpolated, представляющая собой интерполированную версию, основанную на quantileExactWeighted. У некоторых может возникнуть вопрос, зачем нужна новая quantileExactWeightedInterpolated, если уже существует quantileExactInterpolatedWeighted. Причина в том, что новая функция более точная, чем старая. Кстати, она добавлена для совместимости со Spark в Apache Gluten. #69619 (李扬).
  • Добавлена поддержка функции arrayElementOrNull. Она возвращает null, если индекс массива выходит за границы или ключ в Map не найден. #69646 (李扬).
  • Добавлена поддержка типа Dynamic в большинстве функций путём выполнения их над внутренними типами, заключёнными в Dynamic. #69691 (Pavel Kruglov).
  • В функцию arrayAUC добавлен аргумент scale (по умолчанию: true), позволяющий пропустить этап нормализации (issue #69609). #69717 (gabrielmcg44).
  • Повторно добавлена функция RIPEMD160, которая вычисляет криптографический хэш RIPEMD-160 от строки. Пример: SELECT HEX(RIPEMD160('The quick brown fox jumps over the lazy dog')) возвращает 37F332F68DB77BD9D7EDD4969571AD671CF9DD3B. #70087 (Dergousov Maxim).
  • Добавлена возможность кэшировать прочитанные файлы для движков таблиц объектного хранилища и озёр данных, используя хеш из ETag и пути к файлу в качестве ключа кэша. #70135 (Kseniia Sumarokova).
  • Добавлена поддержка чтения таблиц Iceberg на HDFS. #70268 (flynn).
  • Добавлена возможность читать и записывать значения типа JSON в виде двоичной строки в формате RowBinary при использовании настроек input_format_binary_read_json_as_string/output_format_binary_write_json_as_string. #70288 (Pavel Kruglov).
  • Позволяет сериализовывать/десериализовывать столбец JSON как один столбец типа String в формате Native. При выводе используйте настройку output_format_native_write_json_as_string. При вводе используйте версию сериализации 1 перед данными столбца. #70312 (Pavel Kruglov).
  • Добавлена поддержка стандартного CTE with insert; ранее поддерживался только синтаксис insert ... with .... #70593 (Shichao Jin).