diff --git a/CHANGELOG.md b/CHANGELOG.md index b9e23d6ea71..00ae12339b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ### Bug fixes: * Fixed error in `dictGet...` function for dictionaries of type `range`, if one of the arguments is constant and other is not. [#3751](https://github.com/yandex/ClickHouse/pull/3751) * Fixed error that caused messages `netlink: '...': attribute type 1 has an invalid length` to be printed in Linux kernel log, that was happening only on fresh enough versions of Linux kernel. [#3749](https://github.com/yandex/ClickHouse/pull/3749) -* Fixed segfault in function `empty` for argument of `FixedString` type. [#3703](https://github.com/yandex/ClickHouse/pull/3703) +* Fixed segfault in function `empty` for argument of `FixedString` type. [Daniel, Dao Quang Minh](https://github.com/yandex/ClickHouse/pull/3703) * Fixed excessive memory allocation when using large value of `max_query_size` setting (a memory chunk of `max_query_size` bytes was preallocated at once). [#3720](https://github.com/yandex/ClickHouse/pull/3720) ### Build changes: diff --git a/CHANGELOG_RU.md b/CHANGELOG_RU.md index f023eee4680..a03d064cf4b 100644 --- a/CHANGELOG_RU.md +++ b/CHANGELOG_RU.md @@ -2,91 +2,96 @@ ### Новые возможности: -* Вычисление `DEFAULT` выражений для отсутствующих полей при загрузке данных в полуструктурированных форматах (`JSONEachRow`, `TSKV`). -* Для запроса `ALTER TABLE` добавлено действие `MODIFY ORDER BY` для изменения ключа сортировки при одновременном добавлении или удалении столбца таблицы. Это полезно для таблиц семейства `MergeTree`, выполняющих дополнительную работу при слияниях, согласно этому ключу сортировки, как например, `SummingMergeTree`, `AggregatingMergeTree` и т. п. -* Для таблиц семейства `MergeTree` появилась возможность указать различный ключ сортировки (`ORDER BY`) и индекс (`PRIMARY KEY`). Ключ сортировки может быть длиннее, чем индекс. -* Добавлена табличная функция `hdfs` и движок таблиц `HDFS` для импорта и экспорта данных в HDFS. -* Добавлены функции для работы с base64: `base64Encode`, `base64Decode`, `tryBase64Decode`. -* Для агрегатной функции `uniqCombined` появилась возможность настраивать точность работы с помощью параметра (выбирать количество ячеек HyperLogLog). -* Добавлена таблица `system.contributors`, содержащая имена всех, кто делал коммиты в ClickHouse. -* Добавлена возможность не указывать партицию для запроса `ALTER TABLE ... FREEZE` для бэкапа сразу всех партиций. -* Добавлены функции `dictGet`, `dictGetOrDefault` без указания типа возвращаемого значения. Тип определяется автоматически из описания словаря. -* Возможность указания комментария для столбца в описании таблицы и изменения его с помощью `ALTER`. -* Возможность чтения из таблицы типа `Join` в случае простых ключей. -* Возможность указания настроек `join_use_nulls`, `max_rows_in_join`, `max_bytes_in_join`, `join_overflow_mode` при создании таблицы типа `Join`. -* Добавлена функция `joinGet`, позволяющая использовать таблицы типа `Join` как словарь. -* Добавлены столбцы `partition_key`, `sorting_key`, `primary_key`, `sampling_key` в таблицу `system.tables`, позволяющие получить информацию о ключах таблицы. -* Добавлены столбцы `is_in_partition_key`, `is_in_sorting_key`, `is_in_primary_key`, `is_in_sampling_key` в таблицу `system.columns`. -* Добавлены столбцы `min_time`, `max_time` в таблицу `system.parts`. Эти столбцы заполняются, если ключ партиционирования является выражением от столбцов типа `DateTime`. +* Вычисление `DEFAULT` выражений для отсутствующих полей при загрузке данных в полуструктурированных форматах (`JSONEachRow`, `TSKV`). [#3555](https://github.com/yandex/ClickHouse/pull/3555) +* Для запроса `ALTER TABLE` добавлено действие `MODIFY ORDER BY` для изменения ключа сортировки при одновременном добавлении или удалении столбца таблицы. Это полезно для таблиц семейства `MergeTree`, выполняющих дополнительную работу при слияниях, согласно этому ключу сортировки, как например, `SummingMergeTree`, `AggregatingMergeTree` и т. п. [#3581](https://github.com/yandex/ClickHouse/pull/3581) [#3755](https://github.com/yandex/ClickHouse/pull/3755) +* Для таблиц семейства `MergeTree` появилась возможность указать различный ключ сортировки (`ORDER BY`) и индекс (`PRIMARY KEY`). Ключ сортировки может быть длиннее, чем индекс. [#3581](https://github.com/yandex/ClickHouse/pull/3581) +* Добавлена табличная функция `hdfs` и движок таблиц `HDFS` для импорта и экспорта данных в HDFS. [chenxing-xc](https://github.com/yandex/ClickHouse/pull/3617) +* Добавлены функции для работы с base64: `base64Encode`, `base64Decode`, `tryBase64Decode`. [Alexander Krasheninnikov](https://github.com/yandex/ClickHouse/pull/3350) +* Для агрегатной функции `uniqCombined` появилась возможность настраивать точность работы с помощью параметра (выбирать количество ячеек HyperLogLog). [#3406](https://github.com/yandex/ClickHouse/pull/3406) +* Добавлена таблица `system.contributors`, содержащая имена всех, кто делал коммиты в ClickHouse. [#3452](https://github.com/yandex/ClickHouse/pull/3452) +* Добавлена возможность не указывать партицию для запроса `ALTER TABLE ... FREEZE` для бэкапа сразу всех партиций. [#3514](https://github.com/yandex/ClickHouse/pull/3514) +* Добавлены функции `dictGet`, `dictGetOrDefault` без указания типа возвращаемого значения. Тип определяется автоматически из описания словаря. [Amos Bird](https://github.com/yandex/ClickHouse/pull/3564) +* Возможность указания комментария для столбца в описании таблицы и изменения его с помощью `ALTER`. [#3377](https://github.com/yandex/ClickHouse/pull/3377) +* Возможность чтения из таблицы типа `Join` в случае простых ключей. [Amos Bird](https://github.com/yandex/ClickHouse/pull/3728) +* Возможность указания настроек `join_use_nulls`, `max_rows_in_join`, `max_bytes_in_join`, `join_overflow_mode` при создании таблицы типа `Join`. [Amos Bird](https://github.com/yandex/ClickHouse/pull/3728) +* Добавлена функция `joinGet`, позволяющая использовать таблицы типа `Join` как словарь. [Amos Bird](https://github.com/yandex/ClickHouse/pull/3728) +* Добавлены столбцы `partition_key`, `sorting_key`, `primary_key`, `sampling_key` в таблицу `system.tables`, позволяющие получить информацию о ключах таблицы. [#3609](https://github.com/yandex/ClickHouse/pull/3609) +* Добавлены столбцы `is_in_partition_key`, `is_in_sorting_key`, `is_in_primary_key`, `is_in_sampling_key` в таблицу `system.columns`. [#3609](https://github.com/yandex/ClickHouse/pull/3609) +* Добавлены столбцы `min_time`, `max_time` в таблицу `system.parts`. Эти столбцы заполняются, если ключ партиционирования является выражением от столбцов типа `DateTime`. [Emmanuel Donin de Rosière](https://github.com/yandex/ClickHouse/pull/3800) ### Исправления ошибок: -* Исправления и улучшения производительности для типа данных `LowCardinality`. `GROUP BY` по `LowCardinality(Nullable(...))`. Получение `extremes` значений. Выполнение функций высшего порядка. `LEFT ARRAY JOIN`. Распределённый `GROUP BY`. Функции, возвращающие `Array`. Выполнение `ORDER BY`. Запись в `Distributed` таблицы (nicelulu). Обратная совместимость для запросов `INSERT` от старых клиентов, реализующих `Native` протокол. Поддержка `LowCardinality` для `JOIN`. Производительность при работе в один поток. -* Исправлена работа настройки `select_sequential_consistency`. Ранее, при включенной настройке, после начала записи в новую партицию, мог возвращаться неполный результат. -* Корректное указание базы данных при выполнении DDL запросов `ON CLUSTER`, а также при выполнении `ALTER UPDATE/DELETE`. -* Корректное указание базы данных для подзапросов внутри VIEW. -* Исправлена работа `PREWHERE` с `FINAL` для `VersionedCollapsingMergeTree`. -* Возможность с помощью запроса `KILL QUERY` отмены запросов, которые ещё не начали выполняться из-за ожидания блокировки таблицы. -* Исправлены расчёты с датой и временем в случае, если стрелки часов были переведены назад в полночь (это происходит в Иране, а также было Москве с 1981 по 1983 год). Ранее это приводило к тому, что стрелки часов переводились на сутки раньше, чем нужно, а также приводило к некорректному форматированию даты-с-временем в текстовом виде. -* Исправлена работа некоторых случаев `VIEW` и подзапросов без указания базы данных. -* Исправлен race condition при одновременном чтении из `MATERIALIZED VIEW` и удалением `MATERIALIZED VIEW` из-за отсутствия блокировки внутренней таблицы `MATERIALIZED VIEW`. -* Исправлена ошибка `Lock handler cannot be nullptr.` -* Исправления выполнения запросов при включенной настройке `compile_expressions` (выключена по-умолчанию) - убрана свёртка недетерминированных константных выражений, как например, функции `now`. +* Исправления и улучшения производительности для типа данных `LowCardinality`. `GROUP BY` по `LowCardinality(Nullable(...))`. Получение `extremes` значений. Выполнение функций высшего порядка. `LEFT ARRAY JOIN`. Распределённый `GROUP BY`. Функции, возвращающие `Array`. Выполнение `ORDER BY`. Запись в `Distributed` таблицы (nicelulu). Обратная совместимость для запросов `INSERT` от старых клиентов, реализующих `Native` протокол. Поддержка `LowCardinality` для `JOIN`. Производительность при работе в один поток. [#3823](https://github.com/yandex/ClickHouse/pull/3823) [#3803](https://github.com/yandex/ClickHouse/pull/3803) [#3799](https://github.com/yandex/ClickHouse/pull/3799) [#3769](https://github.com/yandex/ClickHouse/pull/3769) [#3744](https://github.com/yandex/ClickHouse/pull/3744) [#3681](https://github.com/yandex/ClickHouse/pull/3681) [#3651](https://github.com/yandex/ClickHouse/pull/3651) [#3649](https://github.com/yandex/ClickHouse/pull/3649) [#3641](https://github.com/yandex/ClickHouse/pull/3641) [#3632](https://github.com/yandex/ClickHouse/pull/3632) [#3568](https://github.com/yandex/ClickHouse/pull/3568) [#3523](https://github.com/yandex/ClickHouse/pull/3523) [#3518](https://github.com/yandex/ClickHouse/pull/3518) +* Исправлена работа настройки `select_sequential_consistency`. Ранее, при включенной настройке, после начала записи в новую партицию, мог возвращаться неполный результат. [#2863](https://github.com/yandex/ClickHouse/pull/2863) +* Корректное указание базы данных при выполнении DDL запросов `ON CLUSTER`, а также при выполнении `ALTER UPDATE/DELETE`. [#3772](https://github.com/yandex/ClickHouse/pull/3772) [#3460](https://github.com/yandex/ClickHouse/pull/3460) +* Корректное указание базы данных для подзапросов внутри VIEW. [#3521](https://github.com/yandex/ClickHouse/pull/3521) +* Исправлена работа `PREWHERE` с `FINAL` для `VersionedCollapsingMergeTree`. [7167bfd7](https://github.com/yandex/ClickHouse/commit/7167bfd7b365538f7a91c4307ad77e552ab4e8c1) +* Возможность с помощью запроса `KILL QUERY` отмены запросов, которые ещё не начали выполняться из-за ожидания блокировки таблицы. [#3517](https://github.com/yandex/ClickHouse/pull/3517) +* Исправлены расчёты с датой и временем в случае, если стрелки часов были переведены назад в полночь (это происходит в Иране, а также было Москве с 1981 по 1983 год). Ранее это приводило к тому, что стрелки часов переводились на сутки раньше, чем нужно, а также приводило к некорректному форматированию даты-с-временем в текстовом виде. [#3819](https://github.com/yandex/ClickHouse/pull/3819) +* Исправлена работа некоторых случаев `VIEW` и подзапросов без указания базы данных. [Winter Zhang](https://github.com/yandex/ClickHouse/pull/3521) +* Исправлен race condition при одновременном чтении из `MATERIALIZED VIEW` и удалением `MATERIALIZED VIEW` из-за отсутствия блокировки внутренней таблицы `MATERIALIZED VIEW`. [#3404](https://github.com/yandex/ClickHouse/pull/3404) [#3694](https://github.com/yandex/ClickHouse/pull/3694) +* Исправлена ошибка `Lock handler cannot be nullptr.` [#3689](https://github.com/yandex/ClickHouse/pull/3689) +* Исправления выполнения запросов при включенной настройке `compile_expressions` (включена по-умолчанию) - убрана свёртка недетерминированных константных выражений, как например, функции `now`. [#3457](https://github.com/yandex/ClickHouse/pull/3457) * Исправлено падение при указании неконстантного аргумента scale в функциях `toDecimal32/64/128`. -* Исправлена ошибка при попытке вставки в формате `Values` массива с `NULL` элементами в столбец типа `Array` без `Nullable` (в случае `input_format_values_interpret_expressions` = 1). -* Исправлено непрерывное логгирование ошибок в `DDLWorker`, если ZooKeeper недоступен. -* Исправлен тип возвращаемого значения для функций `quantile*` от аргументов типа `Date` и `DateTime`. -* Исправлена работа секции `WITH`, если она задаёт простой алиас без выражений. -* Исправлена обработка запросов с именованными подзапросами и квалифицированными именами столбцов при включенной настройке `enable_optimize_predicate_expression`. -* Исправлена ошибка `Attempt to attach to nullptr thread group` при работе материализованных представлений. -* Исправлено падение при передаче некоторых некорректных аргументов в функцию `arrayReverse`. -* Исправлен buffer overflow в функции `extractURLParameter`. Увеличена производительность. Добавлена корректная обработка строк, содержащих нулевые байты. -* Исправлен buffer overflow в функциях `lowerUTF8`, `upperUTF8`. Удалена возможность выполнения этих функций над аргументами типа `FixedString`. -* Исправлен редкий race condition при удалении таблиц типа `MergeTree`. -* Исправлен race condition при чтении из таблиц типа `Buffer` и одновременном `ALTER` либо `DROP` таблиц назначения. -* Исправлен segfault в случае превышения ограничения `max_temporary_non_const_columns`. +* Исправлена ошибка при попытке вставки в формате `Values` массива с `NULL` элементами в столбец типа `Array` без `Nullable` (в случае `input_format_values_interpret_expressions` = 1). [#3487](https://github.com/yandex/ClickHouse/pull/3487) [#3503](https://github.com/yandex/ClickHouse/pull/3503) +* Исправлено непрерывное логгирование ошибок в `DDLWorker`, если ZooKeeper недоступен. [8f50c620](https://github.com/yandex/ClickHouse/commit/8f50c620334988b28018213ec0092fe6423847e2) +* Исправлен тип возвращаемого значения для функций `quantile*` от аргументов типа `Date` и `DateTime`. [#3580](https://github.com/yandex/ClickHouse/pull/3580) +* Исправлена работа секции `WITH`, если она задаёт простой алиас без выражений. [#3570](https://github.com/yandex/ClickHouse/pull/3570) +* Исправлена обработка запросов с именованными подзапросами и квалифицированными именами столбцов при включенной настройке `enable_optimize_predicate_expression`. [Winter Zhang](https://github.com/yandex/ClickHouse/pull/3588) +* Исправлена ошибка `Attempt to attach to nullptr thread group` при работе материализованных представлений. [Marek Vavruša](https://github.com/yandex/ClickHouse/pull/3623) +* Исправлено падение при передаче некоторых некорректных аргументов в функцию `arrayReverse`. [73e3a7b6](https://github.com/yandex/ClickHouse/commit/73e3a7b662161d6005e7727d8a711b930386b871) +* Исправлен buffer overflow в функции `extractURLParameter`. Увеличена производительность. Добавлена корректная обработка строк, содержащих нулевые байты. [141e9799](https://github.com/yandex/ClickHouse/commit/141e9799e49201d84ea8e951d1bed4fb6d3dacb5) +* Исправлен buffer overflow в функциях `lowerUTF8`, `upperUTF8`. Удалена возможность выполнения этих функций над аргументами типа `FixedString`. [#3662](https://github.com/yandex/ClickHouse/pull/3662) +* Исправлен редкий race condition при удалении таблиц типа `MergeTree`. [#3680](https://github.com/yandex/ClickHouse/pull/3680) +* Исправлен race condition при чтении из таблиц типа `Buffer` и одновременном `ALTER` либо `DROP` таблиц назначения. [#3719](https://github.com/yandex/ClickHouse/pull/3719) +* Исправлен segfault в случае превышения ограничения `max_temporary_non_const_columns`. [#3788](https://github.com/yandex/ClickHouse/pull/3788) ### Улучшения: -* Обработанные конфигурационные файлы записываются сервером не в `/etc/clickhouse-server/` директорию, а в директорию `preprocessed_configs` внутри `path`. Это позволяет оставить директорию `/etc/clickhouse-server/` недоступной для записи пользователем `clickhouse`, что повышает безопасность. -* Настройка `min_merge_bytes_to_use_direct_io` выставлена по-умолчанию в 10 GiB. Слияния, образующие крупные куски таблиц семейства MergeTree, будут производиться в режиме `O_DIRECT`, что исключает вымывание кэша. -* Ускорен запуск сервера в случае наличия очень большого количества таблиц. -* Добавлен пул соединений и HTTP `Keep-Alive` для соединения между репликами. -* В случае ошибки синтаксиса запроса, в `HTTP` интерфейсе возвращается код `400 Bad Request` (ранее возвращался код 500). -* Для настройки `join_default_strictness` выбрано значение по-умолчанию `ALL` для совместимости. -* Убрано логгирование в `stderr` из библиотеки `re2` в случае некорректных или сложных регулярных выражений. -* Для движка таблиц `Kafka` TODO -* Функции `cityHash64`, `farmHash64`, `metroHash64`, `sipHash64`, `halfMD5`, `murmurHash2_32`, `murmurHash2_64`, `murmurHash3_32`, `murmurHash3_64` теперь работают для произвольного количества аргументов, а также для аргументов-кортежей. -* Функция `arrayReverse` теперь работает с любыми типами массивов. -* Добавлен опциональный параметр - размер слота для функции `timeSlots`. -* Для `FULL` и `RIGHT JOIN` учитывается настройка `max_block_size` для потока неприсоединённых данных из правой таблицы. -* В `clickhouse-benchmark` и `clickhouse-performance-test` добавлен параметр командной строки `--secure` для включения TLS. -* Преобразование типов в случае, если структура таблицы типа `Buffer` не соответствует структуре таблицы назначения. -* Добавлена настройка `tcp_keep_alive_timeout` для включения keep-alive пакетов после неактивности в течение указанного интервала времени. -* Убрано излишнее квотирование значений ключа партиции в таблице `system.parts`, если он состоит из одного столбца. -* Функция деления с остатком работает для типов данных `Date` и `DateTime`. -* Добавлены синонимы функций `POWER`, `LN`, `LCASE`, `UCASE`, `REPLACE`, `LOCATE`, `SUBSTR`, `MID`. Некоторые имена функций сделаны регистронезависимыми для совместимости со стандартом SQL. Добавлен синтаксический сахар `SUBSTRING(expr FROM start FOR length)` для совместимости с SQL. -* Добавлена возможность фиксации (`mlock`) страниц памяти, соответствующих исполняемому коду `clickhouse-server` для предотвращения вытеснения их из памяти. Возможность выключена по-умолчанию. -* Увеличена производительность чтения с `O_DIRECT` (с включенной опцией `min_bytes_to_use_direct_io`). -* Улучшена производительность работы функции `dictGet...OrDefault` в случае константного аргумента-ключа и неконстантного аргумента-default. -* В функции `firstSignificantSubdomain` добавлена обработка доменов `gov`, `mil`, `edu`. Увеличена производительность работы. +* Обработанные конфигурационные файлы записываются сервером не в `/etc/clickhouse-server/` директорию, а в директорию `preprocessed_configs` внутри `path`. Это позволяет оставить директорию `/etc/clickhouse-server/` недоступной для записи пользователем `clickhouse`, что повышает безопасность. [#2443](https://github.com/yandex/ClickHouse/pull/2443) +* Настройка `min_merge_bytes_to_use_direct_io` выставлена по-умолчанию в 10 GiB. Слияния, образующие крупные куски таблиц семейства MergeTree, будут производиться в режиме `O_DIRECT`, что исключает вымывание кэша. [#3504](https://github.com/yandex/ClickHouse/pull/3504) +* Ускорен запуск сервера в случае наличия очень большого количества таблиц. [#3398](https://github.com/yandex/ClickHouse/pull/3398) +* Добавлен пул соединений и HTTP `Keep-Alive` для соединения между репликами. [#3594](https://github.com/yandex/ClickHouse/pull/3594) +* В случае ошибки синтаксиса запроса, в `HTTP` интерфейсе возвращается код `400 Bad Request` (ранее возвращался код 500). [31bc680a](https://github.com/yandex/ClickHouse/commit/31bc680ac5f4bb1d0360a8ba4696fa84bb47d6ab) +* Для настройки `join_default_strictness` выбрано значение по-умолчанию `ALL` для совместимости. [120e2cbe](https://github.com/yandex/ClickHouse/commit/120e2cbe2ff4fbad626c28042d9b28781c805afe) +* Убрано логгирование в `stderr` из библиотеки `re2` в случае некорректных или сложных регулярных выражений. [#3723](https://github.com/yandex/ClickHouse/pull/3723) +* Для движка таблиц `Kafka`: проверка наличия подписок перед началом чтения из Kafka; настройка таблицы kafka_max_block_size. [Marek Vavruša](https://github.com/yandex/ClickHouse/pull/3396) +* Функции `cityHash64`, `farmHash64`, `metroHash64`, `sipHash64`, `halfMD5`, `murmurHash2_32`, `murmurHash2_64`, `murmurHash3_32`, `murmurHash3_64` теперь работают для произвольного количества аргументов, а также для аргументов-кортежей. [#3451](https://github.com/yandex/ClickHouse/pull/3451) [#3519](https://github.com/yandex/ClickHouse/pull/3519) +* Функция `arrayReverse` теперь работает с любыми типами массивов. [73e3a7b6](https://github.com/yandex/ClickHouse/commit/73e3a7b662161d6005e7727d8a711b930386b871) +* Добавлен опциональный параметр - размер слота для функции `timeSlots`. [Kirill Shvakov](https://github.com/yandex/ClickHouse/pull/3724) +* Для `FULL` и `RIGHT JOIN` учитывается настройка `max_block_size` для потока неприсоединённых данных из правой таблицы. [Amos Bird](https://github.com/yandex/ClickHouse/pull/3699) +* В `clickhouse-benchmark` и `clickhouse-performance-test` добавлен параметр командной строки `--secure` для включения TLS. [#3688](https://github.com/yandex/ClickHouse/pull/3688) [#3690](https://github.com/yandex/ClickHouse/pull/3690) +* Преобразование типов в случае, если структура таблицы типа `Buffer` не соответствует структуре таблицы назначения. [Vitaly Baranov](https://github.com/yandex/ClickHouse/pull/3603) +* Добавлена настройка `tcp_keep_alive_timeout` для включения keep-alive пакетов после неактивности в течение указанного интервала времени. [#3441](https://github.com/yandex/ClickHouse/pull/3441) +* Убрано излишнее квотирование значений ключа партиции в таблице `system.parts`, если он состоит из одного столбца. [#3652](https://github.com/yandex/ClickHouse/pull/3652) +* Функция деления с остатком работает для типов данных `Date` и `DateTime`. [#3385](https://github.com/yandex/ClickHouse/pull/3385) +* Добавлены синонимы функций `POWER`, `LN`, `LCASE`, `UCASE`, `REPLACE`, `LOCATE`, `SUBSTR`, `MID`. [#3774](https://github.com/yandex/ClickHouse/pull/3774) [#3763](https://github.com/yandex/ClickHouse/pull/3763) Некоторые имена функций сделаны регистронезависимыми для совместимости со стандартом SQL. Добавлен синтаксический сахар `SUBSTRING(expr FROM start FOR length)` для совместимости с SQL. [#3804](https://github.com/yandex/ClickHouse/pull/3804) +* Добавлена возможность фиксации (`mlock`) страниц памяти, соответствующих исполняемому коду `clickhouse-server` для предотвращения вытеснения их из памяти. Возможность выключена по-умолчанию. [#3553](https://github.com/yandex/ClickHouse/pull/3553) +* Увеличена производительность чтения с `O_DIRECT` (с включенной опцией `min_bytes_to_use_direct_io`). [#3405](https://github.com/yandex/ClickHouse/pull/3405) +* Улучшена производительность работы функции `dictGet...OrDefault` в случае константного аргумента-ключа и неконстантного аргумента-default. [Amos Bird](https://github.com/yandex/ClickHouse/pull/3563) +* В функции `firstSignificantSubdomain` добавлена обработка доменов `gov`, `mil`, `edu`. [Igor Hatarist](https://github.com/yandex/ClickHouse/pull/3601) Увеличена производительность работы. [#3628](https://github.com/yandex/ClickHouse/pull/3628) * Возможность указания произвольных переменных окружения для запуска `clickhouse-server` посредством `SYS-V init.d`-скрипта с помощью указания `CLICKHOUSE_PROGRAM_ENV` в `/etc/default/clickhouse`. -* Правильный код возврата init-скрипта clickhouse-server. -* В таблицу `system.metrics` добавлена метрика `VersionInteger`, а в `system.build_options` добавлена строчка `VERSION_INTEGER`, содержащая версию ClickHouse в числовом представлении, вида `18016000`. -* Удалена возможность сравнения типа `Date` с числом, чтобы избежать потенциальных ошибок вида `date = 2018-12-17`, где ошибочно не указаны кавычки вокруг даты. -* Исправлено поведение функций с состоянием типа `rowNumberInAllBlocks` - раньше они выдавали число на единицу больше вследствие их запуска во время анализа запроса. -* При невозможности удалить файл `force_restore_data`, выводится сообщение об ошибке. +[Pavlo Bashynskyi](https://github.com/yandex/ClickHouse/pull/3612) +* Правильный код возврата init-скрипта clickhouse-server. [#3516](https://github.com/yandex/ClickHouse/pull/3516) +* В таблицу `system.metrics` добавлена метрика `VersionInteger`, а в `system.build_options` добавлена строчка `VERSION_INTEGER`, содержащая версию ClickHouse в числовом представлении, вида `18016000`. [#3644](https://github.com/yandex/ClickHouse/pull/3644) +* Удалена возможность сравнения типа `Date` с числом, чтобы избежать потенциальных ошибок вида `date = 2018-12-17`, где ошибочно не указаны кавычки вокруг даты. [#3687](https://github.com/yandex/ClickHouse/pull/3687) +* Исправлено поведение функций с состоянием типа `rowNumberInAllBlocks` - раньше они выдавали число на единицу больше вследствие их запуска во время анализа запроса. [Amos Bird](https://github.com/yandex/ClickHouse/pull/3729) +* При невозможности удалить файл `force_restore_data`, выводится сообщение об ошибке. [Amos Bird](https://github.com/yandex/ClickHouse/pull/3794) ### Улучшение сборки: -* Обновлена библиотека `jemalloc`, что исправляет потенциальную утечку памяти. -* Для debug сборок включено по-умолчанию профилирование `jemalloc`. -* Добавлена возможность запуска интеграционных тестов, при наличии установленным в системе лишь `Docker`. -* Добавлен fuzz тест выражений в SELECT запросах. -* Добавлен покоммитный стресс-тест, выполняющий функциональные тесты параллельно и в произвольном порядке, позволяющий обнаружить больше race conditions. -* Улучшение способа запуска clickhouse-server в Docker образе. -* Для Docker образа добавлена поддержка инициализации базы данных с помощью файлов в директории `/docker-entrypoint-initdb.d`. -* Исправления для сборки под ARM. +* Обновлена библиотека `jemalloc`, что исправляет потенциальную утечку памяти. [Amos Bird](https://github.com/yandex/ClickHouse/pull/3557) +* Для debug сборок включено по-умолчанию профилирование `jemalloc`. [2cc82f5c](https://github.com/yandex/ClickHouse/commit/2cc82f5cbe266421cd4c1165286c2c47e5ffcb15) +* Добавлена возможность запуска интеграционных тестов, при наличии установленным в системе лишь `Docker`. [#3650](https://github.com/yandex/ClickHouse/pull/3650) +* Добавлен fuzz тест выражений в SELECT запросах. [#3442](https://github.com/yandex/ClickHouse/pull/3442) +* Добавлен покоммитный стресс-тест, выполняющий функциональные тесты параллельно и в произвольном порядке, позволяющий обнаружить больше race conditions. [#3438](https://github.com/yandex/ClickHouse/pull/3438) +* Улучшение способа запуска clickhouse-server в Docker образе. [Elghazal Ahmed](https://github.com/yandex/ClickHouse/pull/3663) +* Для Docker образа добавлена поддержка инициализации базы данных с помощью файлов в директории `/docker-entrypoint-initdb.d`. [Konstantin Lebedev](https://github.com/yandex/ClickHouse/pull/3695) +* Исправления для сборки под ARM. [#3709](https://github.com/yandex/ClickHouse/pull/3709) + +### Обратно несовместимые изменения: + +* Удалена возможность сравнения типа `Date` с числом, необходимо вместо `toDate('2018-12-18') = 17883`, использовать явное приведение типов `= toDate(17883)` [#3687](https://github.com/yandex/ClickHouse/pull/3687) ## ClickHouse release 18.14.18, 2018-12-04 @@ -94,7 +99,7 @@ ### Исправления ошибок: * Исправлена ошибка в функции `dictGet...` для словарей типа `range`, если один из аргументов константный, а другой - нет. [#3751](https://github.com/yandex/ClickHouse/pull/3751) * Исправлена ошибка, приводящая к выводу сообщений `netlink: '...': attribute type 1 has an invalid length` в логе ядра Linux, проявляющаяся на достаточно новых ядрах Linux. [#3749](https://github.com/yandex/ClickHouse/pull/3749) -* Исправлен segfault при выполнении функции `empty` от аргумента типа `FixedString`. [#3703](https://github.com/yandex/ClickHouse/pull/3703) +* Исправлен segfault при выполнении функции `empty` от аргумента типа `FixedString`. [Daniel, Dao Quang Minh](https://github.com/yandex/ClickHouse/pull/3703) * Исправлена избыточная аллокация памяти при большом значении настройки `max_query_size` (кусок памяти размера `max_query_size` выделялся сразу). [#3720](https://github.com/yandex/ClickHouse/pull/3720) ### Улучшения процесса сборки ClickHouse: diff --git a/dbms/src/Common/Config/ConfigProcessor.cpp b/dbms/src/Common/Config/ConfigProcessor.cpp index 081bcd7c995..7e9579366b1 100644 --- a/dbms/src/Common/Config/ConfigProcessor.cpp +++ b/dbms/src/Common/Config/ConfigProcessor.cpp @@ -24,7 +24,7 @@ namespace DB { /// For cutting prerpocessed path to this base -std::string main_config_path; +static std::string main_config_path; /// Extracts from a string the first encountered number consisting of at least two digits. static std::string numberFromHost(const std::string & s) diff --git a/dbms/src/DataTypes/FieldToDataType.cpp b/dbms/src/DataTypes/FieldToDataType.cpp index 3086c9167c2..18fa0e97b88 100644 --- a/dbms/src/DataTypes/FieldToDataType.cpp +++ b/dbms/src/DataTypes/FieldToDataType.cpp @@ -8,7 +8,6 @@ #include #include #include -#include #include #include diff --git a/dbms/src/DataTypes/IDataType.h b/dbms/src/DataTypes/IDataType.h index 166320c75f2..8f38e334024 100644 --- a/dbms/src/DataTypes/IDataType.h +++ b/dbms/src/DataTypes/IDataType.h @@ -26,7 +26,7 @@ using DataTypes = std::vector; /** Properties of data type. * Contains methods for serialization/deserialization. * Implementations of this interface represent a data type (example: UInt8) - * or parapetric family of data types (example: Array(...)). + * or parametric family of data types (example: Array(...)). * * DataType is totally immutable object. You can always share them. */ diff --git a/dbms/src/Functions/FunctionsHashing.cpp b/dbms/src/Functions/FunctionsHashing.cpp index bafd205e16c..edf3a66d515 100644 --- a/dbms/src/Functions/FunctionsHashing.cpp +++ b/dbms/src/Functions/FunctionsHashing.cpp @@ -20,6 +20,8 @@ void registerFunctionsHashing(FunctionFactory & factory) factory.registerFunction(); factory.registerFunction(); factory.registerFunction(); + factory.registerFunction(); + factory.registerFunction(); factory.registerFunction(); factory.registerFunction(); factory.registerFunction(); diff --git a/dbms/src/Functions/FunctionsHashing.h b/dbms/src/Functions/FunctionsHashing.h index 22c664d433e..3dd72865337 100644 --- a/dbms/src/Functions/FunctionsHashing.h +++ b/dbms/src/Functions/FunctionsHashing.h @@ -41,6 +41,7 @@ namespace ErrorCodes { extern const int LOGICAL_ERROR; extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; + extern const int NOT_IMPLEMENTED; } @@ -298,6 +299,51 @@ struct MurmurHash3Impl64 static constexpr bool use_int_hash_for_pods = false; }; +/// http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/478a4add975b/src/share/classes/java/lang/String.java#l1452 +/// Care should be taken to do all calculation in unsigned integers (to avoid undefined behaviour on overflow) +/// but obtain the same result as it is done in singed integers with two's complement arithmetic. +struct JavaHashImpl +{ + static constexpr auto name = "javaHash"; + using ReturnType = Int32; + + static Int32 apply(const char * data, const size_t size) + { + UInt32 h = 0; + for (size_t i = 0; i < size; ++i) + h = 31 * h + static_cast(static_cast(data[i])); + return static_cast(h); + } + + static Int32 combineHashes(Int32, Int32) + { + throw Exception("Java hash is not combineable for multiple arguments", ErrorCodes::NOT_IMPLEMENTED); + } + + static constexpr bool use_int_hash_for_pods = false; +}; + +/// This is just JavaHash with zeroed out sign bit. +/// This function is used in Hive for versions before 3.0, +/// after 3.0, Hive uses murmur-hash3. +struct HiveHashImpl +{ + static constexpr auto name = "hiveHash"; + using ReturnType = Int32; + + static Int32 apply(const char * data, const size_t size) + { + return static_cast(0x7FFFFFFF & static_cast(JavaHashImpl::apply(data, size))); + } + + static Int32 combineHashes(Int32, Int32) + { + throw Exception("Hive hash is not combineable for multiple arguments", ErrorCodes::NOT_IMPLEMENTED); + } + + static constexpr bool use_int_hash_for_pods = false; +}; + struct MurmurHash3Impl128 { static constexpr auto name = "murmurHash3_128"; @@ -978,4 +1024,7 @@ using FunctionMurmurHash2_64 = FunctionAnyHash; using FunctionMurmurHash3_32 = FunctionAnyHash; using FunctionMurmurHash3_64 = FunctionAnyHash; using FunctionMurmurHash3_128 = FunctionStringHashFixedString; +using FunctionJavaHash = FunctionAnyHash; +using FunctionHiveHash = FunctionAnyHash; + } diff --git a/dbms/src/Functions/FunctionsRound.cpp b/dbms/src/Functions/FunctionsRound.cpp index e5d2436c3eb..6a34d9eb9d3 100644 --- a/dbms/src/Functions/FunctionsRound.cpp +++ b/dbms/src/Functions/FunctionsRound.cpp @@ -10,6 +10,7 @@ void registerFunctionsRound(FunctionFactory & factory) factory.registerFunction("floor", FunctionFactory::CaseInsensitive); factory.registerFunction("ceil", FunctionFactory::CaseInsensitive); factory.registerFunction("trunc", FunctionFactory::CaseInsensitive); + factory.registerFunction(); /// Compatibility aliases. factory.registerAlias("ceiling", "ceil", FunctionFactory::CaseInsensitive); diff --git a/dbms/src/Functions/FunctionsRound.h b/dbms/src/Functions/FunctionsRound.h index 96b17fb05f2..3c9be5f15b9 100644 --- a/dbms/src/Functions/FunctionsRound.h +++ b/dbms/src/Functions/FunctionsRound.h @@ -1,14 +1,19 @@ #pragma once +#include #include #include #include +#include +#include +#include #include #include #include #include #include +#include #if __SSE4_1__ #include @@ -24,6 +29,7 @@ namespace ErrorCodes extern const int ILLEGAL_TYPE_OF_ARGUMENT; extern const int ILLEGAL_COLUMN; extern const int LOGICAL_ERROR; + extern const int BAD_ARGUMENTS; } @@ -556,6 +562,154 @@ public: }; +/** Rounds down to a number within explicitly specified array. + * If the value is less than the minimal bound - returns the minimal bound. + */ +class FunctionRoundDown : public IFunction +{ +public: + static constexpr auto name = "roundDown"; + static FunctionPtr create(const Context & context) { return std::make_shared(context); } + FunctionRoundDown(const Context & context) : context(context) {} + +public: + String getName() const override { return name; } + + bool isVariadic() const override { return false; } + size_t getNumberOfArguments() const override { return 2; } + bool useDefaultImplementationForConstants() const override { return true; } + ColumnNumbers getArgumentsThatAreAlwaysConstant() const override { return {1}; } + + DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override + { + const DataTypePtr & type_x = arguments[0]; + + if (!(isNumber(type_x) || isDecimal(type_x))) + throw Exception{"Unsupported type " + type_x->getName() + + " of first argument of function " + getName() + + ", must be numeric type.", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT}; + + const DataTypeArray * type_arr = checkAndGetDataType(arguments[1].get()); + + if (!type_arr) + throw Exception{"Second argument of function " + getName() + + ", must be array of boundaries to round to.", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT}; + + const auto type_arr_nested = type_arr->getNestedType(); + + if (!(isNumber(type_arr_nested) || isDecimal(type_arr_nested))) + { + throw Exception{"Elements of array of second argument of function " + getName() + + " must be numeric type.", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT}; + } + return getLeastSupertype({type_x, type_arr_nested}); + } + + void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result, size_t) override + { + auto in_column = block.getByPosition(arguments[0]).column; + const auto & in_type = block.getByPosition(arguments[0]).type; + + auto array_column = block.getByPosition(arguments[1]).column; + const auto & array_type = block.getByPosition(arguments[1]).type; + + const auto & return_type = block.getByPosition(result).type; + auto column_result = return_type->createColumn(); + auto out = column_result.get(); + + if (!in_type->equals(*return_type)) + in_column = castColumn(block.getByPosition(arguments[0]), return_type, context); + + if (!array_type->equals(*return_type)) + array_column = castColumn(block.getByPosition(arguments[1]), std::make_shared(return_type), context); + + const auto in = in_column.get(); + auto boundaries = typeid_cast(*array_column).getValue(); + size_t num_boundaries = boundaries.size(); + if (!num_boundaries) + throw Exception("Empty array is illegal for boundaries in " + getName() + " function", ErrorCodes::BAD_ARGUMENTS); + + if (!executeNum(in, out, boundaries) + && !executeNum(in, out, boundaries) + && !executeNum(in, out, boundaries) + && !executeNum(in, out, boundaries) + && !executeNum(in, out, boundaries) + && !executeNum(in, out, boundaries) + && !executeNum(in, out, boundaries) + && !executeNum(in, out, boundaries) + && !executeNum(in, out, boundaries) + && !executeNum(in, out, boundaries) + && !executeDecimal(in, out, boundaries) + && !executeDecimal(in, out, boundaries) + && !executeDecimal(in, out, boundaries)) + { + throw Exception{"Illegal column " + in->getName() + " of first argument of function " + getName(), ErrorCodes::ILLEGAL_COLUMN}; + } + + block.getByPosition(result).column = std::move(column_result); + } + +private: + template + bool executeNum(const IColumn * in_untyped, IColumn * out_untyped, const Array & boundaries) + { + const auto in = checkAndGetColumn>(in_untyped); + auto out = typeid_cast *>(out_untyped); + if (!in || !out) + return false; + + executeImplNumToNum(in->getData(), out->getData(), boundaries); + return true; + } + + template + bool executeDecimal(const IColumn * in_untyped, IColumn * out_untyped, const Array & boundaries) + { + const auto in = checkAndGetColumn>(in_untyped); + auto out = typeid_cast *>(out_untyped); + if (!in || !out) + return false; + + executeImplNumToNum(in->getData(), out->getData(), boundaries); + return true; + } + + template + void executeImplNumToNum(const Container & src, Container & dst, const Array & boundaries) + { + using ValueType = typename Container::value_type; + std::vector boundary_values(boundaries.size()); + for (size_t i = 0; i < boundaries.size(); ++i) + boundary_values[i] = boundaries[i].get(); + + std::sort(boundary_values.begin(), boundary_values.end()); + boundary_values.erase(std::unique(boundary_values.begin(), boundary_values.end()), boundary_values.end()); + + size_t size = src.size(); + dst.resize(size); + for (size_t i = 0; i < size; ++i) + { + auto it = std::upper_bound(boundary_values.begin(), boundary_values.end(), src[i]); + if (it == boundary_values.end()) + { + dst[i] = boundary_values.back(); + } + else if (it == boundary_values.begin()) + { + dst[i] = boundary_values.front(); + } + else + { + dst[i] = *(it - 1); + } + } + } + +private: + const Context & context; +}; + + struct NameRound { static constexpr auto name = "round"; }; struct NameCeil { static constexpr auto name = "ceil"; }; struct NameFloor { static constexpr auto name = "floor"; }; diff --git a/dbms/src/Interpreters/ExecuteScalarSubqueriesVisitor.cpp b/dbms/src/Interpreters/ExecuteScalarSubqueriesVisitor.cpp index 9cea690a39b..59a8c084b9e 100644 --- a/dbms/src/Interpreters/ExecuteScalarSubqueriesVisitor.cpp +++ b/dbms/src/Interpreters/ExecuteScalarSubqueriesVisitor.cpp @@ -9,6 +9,8 @@ #include #include +#include + namespace DB { @@ -98,6 +100,11 @@ void ExecuteScalarSubqueriesMatcher::visit(const ASTSubquery & subquery, ASTPtr size_t columns = block.columns(); if (columns == 1) { + if (typeid_cast(block.safeGetByPosition(0).type.get())) + { + throw Exception("Scalar subquery can't return an aggregate function state", ErrorCodes::INCORRECT_RESULT_OF_SCALAR_SUBQUERY); + } + auto lit = std::make_unique((*block.safeGetByPosition(0).column)[0]); lit->alias = subquery.alias; lit->prefer_alias_to_column_name = subquery.prefer_alias_to_column_name; @@ -116,6 +123,11 @@ void ExecuteScalarSubqueriesMatcher::visit(const ASTSubquery & subquery, ASTPtr exp_list->children.resize(columns); for (size_t i = 0; i < columns; ++i) { + if (typeid_cast(block.safeGetByPosition(i).type.get())) + { + throw Exception("Scalar subquery can't return an aggregate function state", ErrorCodes::INCORRECT_RESULT_OF_SCALAR_SUBQUERY); + } + exp_list->children[i] = addTypeConversion( std::make_unique((*block.safeGetByPosition(i).column)[0]), block.safeGetByPosition(i).type->getName()); diff --git a/dbms/src/Interpreters/ExpressionAnalyzer.cpp b/dbms/src/Interpreters/ExpressionAnalyzer.cpp index dda46a008ad..e488aa5d81b 100644 --- a/dbms/src/Interpreters/ExpressionAnalyzer.cpp +++ b/dbms/src/Interpreters/ExpressionAnalyzer.cpp @@ -143,15 +143,17 @@ void ExpressionAnalyzer::analyzeAggregation() ExpressionActionsPtr temp_actions = std::make_shared(source_columns, context); - if (select_query && select_query->array_join_expression_list()) - { - getRootActions(select_query->array_join_expression_list(), true, temp_actions); - addMultipleArrayJoinAction(temp_actions); - array_join_columns = temp_actions->getSampleBlock().getNamesAndTypesList(); - } - if (select_query) { + bool is_array_join_left; + ASTPtr array_join_expression_list = select_query->array_join_expression_list(is_array_join_left); + if (array_join_expression_list) + { + getRootActions(array_join_expression_list, true, temp_actions); + addMultipleArrayJoinAction(temp_actions, is_array_join_left); + array_join_columns = temp_actions->getSampleBlock().getNamesAndTypesList(); + } + const ASTTablesInSelectQueryElement * join = select_query->join(); if (join) { @@ -512,7 +514,7 @@ void ExpressionAnalyzer::initChain(ExpressionActionsChain & chain, const NamesAn } /// "Big" ARRAY JOIN. -void ExpressionAnalyzer::addMultipleArrayJoinAction(ExpressionActionsPtr & actions) const +void ExpressionAnalyzer::addMultipleArrayJoinAction(ExpressionActionsPtr & actions, bool array_join_is_left) const { NameSet result_columns; for (const auto & result_source : syntax->array_join_result_to_source) @@ -525,22 +527,24 @@ void ExpressionAnalyzer::addMultipleArrayJoinAction(ExpressionActionsPtr & actio result_columns.insert(result_source.first); } - actions->add(ExpressionAction::arrayJoin(result_columns, select_query->array_join_is_left(), context)); + actions->add(ExpressionAction::arrayJoin(result_columns, array_join_is_left, context)); } bool ExpressionAnalyzer::appendArrayJoin(ExpressionActionsChain & chain, bool only_types) { assertSelect(); - if (!select_query->array_join_expression_list()) + bool is_array_join_left; + ASTPtr array_join_expression_list = select_query->array_join_expression_list(is_array_join_left); + if (!array_join_expression_list) return false; initChain(chain, source_columns); ExpressionActionsChain::Step & step = chain.steps.back(); - getRootActions(select_query->array_join_expression_list(), only_types, step.actions); + getRootActions(array_join_expression_list, only_types, step.actions); - addMultipleArrayJoinAction(step.actions); + addMultipleArrayJoinAction(step.actions, is_array_join_left); return true; } diff --git a/dbms/src/Interpreters/ExpressionAnalyzer.h b/dbms/src/Interpreters/ExpressionAnalyzer.h index 29efda0ce63..ba1e3a252d0 100644 --- a/dbms/src/Interpreters/ExpressionAnalyzer.h +++ b/dbms/src/Interpreters/ExpressionAnalyzer.h @@ -240,7 +240,7 @@ private: /// Find global subqueries in the GLOBAL IN/JOIN sections. Fills in external_tables. void initGlobalSubqueriesAndExternalTables(); - void addMultipleArrayJoinAction(ExpressionActionsPtr & actions) const; + void addMultipleArrayJoinAction(ExpressionActionsPtr & actions, bool is_left) const; void addJoinAction(ExpressionActionsPtr & actions, bool only_types) const; @@ -269,7 +269,7 @@ private: void assertAggregation() const; /** - * Create Set from a subuqery or a table expression in the query. The created set is suitable for using the index. + * Create Set from a subuquery or a table expression in the query. The created set is suitable for using the index. * The set will not be created if its size hits the limit. */ void tryMakeSetForIndexFromSubquery(const ASTPtr & subquery_or_table_name); diff --git a/dbms/src/Interpreters/SyntaxAnalyzer.cpp b/dbms/src/Interpreters/SyntaxAnalyzer.cpp index 78c90a0be8c..3d9a7f55df3 100644 --- a/dbms/src/Interpreters/SyntaxAnalyzer.cpp +++ b/dbms/src/Interpreters/SyntaxAnalyzer.cpp @@ -676,9 +676,13 @@ void optimizeUsing(const ASTSelectQuery * select_query) void getArrayJoinedColumns(ASTPtr & query, SyntaxAnalyzerResult & result, const ASTSelectQuery * select_query, const Names & source_columns, const NameSet & source_columns_set) { - if (select_query && select_query->array_join_expression_list()) + if (!select_query) + return; + + ASTPtr array_join_expression_list = select_query->array_join_expression_list(); + if (array_join_expression_list) { - ASTs & array_join_asts = select_query->array_join_expression_list()->children; + ASTs & array_join_asts = array_join_expression_list->children; for (const auto & ast : array_join_asts) { const String nested_table_name = ast->getColumnName(); diff --git a/dbms/src/Interpreters/evaluateConstantExpression.cpp b/dbms/src/Interpreters/evaluateConstantExpression.cpp index adb60d34eaa..769f45f9c31 100644 --- a/dbms/src/Interpreters/evaluateConstantExpression.cpp +++ b/dbms/src/Interpreters/evaluateConstantExpression.cpp @@ -57,7 +57,7 @@ std::pair> evaluateConstantExpression(co ASTPtr evaluateConstantExpressionAsLiteral(const ASTPtr & node, const Context & context) { - /// Branch with string in qery. + /// Branch with string in query. if (typeid_cast(node.get())) return node; diff --git a/dbms/src/Parsers/ASTSelectQuery.cpp b/dbms/src/Parsers/ASTSelectQuery.cpp index 35e9ed75a4e..4a42585b3c1 100644 --- a/dbms/src/Parsers/ASTSelectQuery.cpp +++ b/dbms/src/Parsers/ASTSelectQuery.cpp @@ -283,23 +283,21 @@ bool ASTSelectQuery::final() const } -ASTPtr ASTSelectQuery::array_join_expression_list() const +ASTPtr ASTSelectQuery::array_join_expression_list(bool & is_left) const { const ASTArrayJoin * array_join = getFirstArrayJoin(*this); if (!array_join) return {}; + is_left = (array_join->kind == ASTArrayJoin::Kind::Left); return array_join->expression_list; } -bool ASTSelectQuery::array_join_is_left() const +ASTPtr ASTSelectQuery::array_join_expression_list() const { - const ASTArrayJoin * array_join = getFirstArrayJoin(*this); - if (!array_join) - return {}; - - return array_join->kind == ASTArrayJoin::Kind::Left; + bool is_left; + return array_join_expression_list(is_left); } diff --git a/dbms/src/Parsers/ASTSelectQuery.h b/dbms/src/Parsers/ASTSelectQuery.h index d9bb3f11be4..bf16e4133de 100644 --- a/dbms/src/Parsers/ASTSelectQuery.h +++ b/dbms/src/Parsers/ASTSelectQuery.h @@ -41,9 +41,9 @@ public: /// Compatibility with old parser of tables list. TODO remove ASTPtr sample_size() const; ASTPtr sample_offset() const; + ASTPtr array_join_expression_list(bool & is_left) const; ASTPtr array_join_expression_list() const; const ASTTablesInSelectQueryElement * join() const; - bool array_join_is_left() const; bool final() const; void replaceDatabaseAndTable(const String & database_name, const String & table_name); void addTableFunction(ASTPtr & table_function_ptr); diff --git a/dbms/tests/performance/roundDown/roundDown.xml b/dbms/tests/performance/roundDown/roundDown.xml new file mode 100644 index 00000000000..18af6916d40 --- /dev/null +++ b/dbms/tests/performance/roundDown/roundDown.xml @@ -0,0 +1,24 @@ + + roundDown + once + + + + 10000 + + + 5000 + 20000 + + + + + + + + SELECT count() FROM system.numbers WHERE NOT ignore(roundDuration(rand() % 65536)) + SELECT count() FROM system.numbers WHERE NOT ignore(roundDown(rand() % 65536, [0, 1, 10, 30, 60, 120, 180, 240, 300, 600, 1200, 1800, 3600, 7200, 18000, 36000])) + SELECT count() FROM system.numbers WHERE NOT ignore(roundAge(rand() % 100)) + SELECT count() FROM system.numbers WHERE NOT ignore(roundDown(rand() % 100, [0, 1, 18, 25, 35, 45, 55])) + SELECT count() FROM system.numbers WHERE NOT ignore(roundDown(rand() % 65536, (SELECT groupArray(number) FROM numbers(65536)))) + diff --git a/dbms/tests/queries/0_stateless/00205_scalar_subqueries.sql b/dbms/tests/queries/0_stateless/00205_scalar_subqueries.sql index f924ff291ea..5ebb524dc53 100644 --- a/dbms/tests/queries/0_stateless/00205_scalar_subqueries.sql +++ b/dbms/tests/queries/0_stateless/00205_scalar_subqueries.sql @@ -1,5 +1,8 @@ +SET send_logs_level = 'none'; + SELECT (SELECT (SELECT (SELECT (SELECT (SELECT count() FROM (SELECT * FROM system.numbers LIMIT 10)))))) = (SELECT 10), ((SELECT 1, 'Hello', [1, 2]).3)[1]; SELECT toUInt64((SELECT 9)) IN (SELECT number FROM system.numbers LIMIT 10); SELECT (SELECT toDate('2015-01-02')) = toDate('2015-01-02'), 'Hello' = (SELECT 'Hello'); SELECT (SELECT toDate('2015-01-02'), 'Hello'); SELECT (SELECT toDate('2015-01-02'), 'Hello') AS x, x, identity((SELECT 1)), identity((SELECT 1) AS y); +SELECT (SELECT uniqState('')); -- { serverError 125 } diff --git a/dbms/tests/queries/0_stateless/00800_function_java_hash.reference b/dbms/tests/queries/0_stateless/00800_function_java_hash.reference new file mode 100644 index 00000000000..7f9c68298bd --- /dev/null +++ b/dbms/tests/queries/0_stateless/00800_function_java_hash.reference @@ -0,0 +1,4 @@ +96354 +-676697544 +96354 +1470786104 diff --git a/dbms/tests/queries/0_stateless/00800_function_java_hash.sql b/dbms/tests/queries/0_stateless/00800_function_java_hash.sql new file mode 100644 index 00000000000..220c1f0ff60 --- /dev/null +++ b/dbms/tests/queries/0_stateless/00800_function_java_hash.sql @@ -0,0 +1,4 @@ +select JavaHash('abc'); +select JavaHash('874293087'); +select HiveHash('abc'); +select HiveHash('874293087'); diff --git a/dbms/tests/queries/0_stateless/00805_round_down.reference b/dbms/tests/queries/0_stateless/00805_round_down.reference new file mode 100644 index 00000000000..0ed04c7757f --- /dev/null +++ b/dbms/tests/queries/0_stateless/00805_round_down.reference @@ -0,0 +1,83 @@ +0 0 +1 1 +2 2 +3 3 +4 4 +5 5 +6 5 +7 5 +8 5 +9 5 +0 -1.5 +1 -1.5 +2 -1.5 +3 2.718281828459045 +4 3.141592653589793 +5 3.141592653589793 +6 5.5 +7 5.5 +8 5.5 +9 5.5 +0 2.718281828459045 +1 2.718281828459045 +2 2.718281828459045 +3 2.718281828459045 +4 3.141592653589793 +5 3.141592653589793 +6 3.141592653589793 +7 3.141592653589793 +8 3.141592653589793 +9 3.141592653589793 +0 4 +1 4 +2 4 +3 4 +4 4 +5 5 +6 6 +7 6 +8 6 +9 6 +1 4 +1 1 +1 1.5 +0 0 +1 0 +2 1.25 +3 2.5 +4 3.75 +5 5 +6 5 +7 6.25 +8 7.5 +9 8.75 +0.00000 4.00000 +0.01000 4.00000 +0.02000 4.00000 +0.03000 4.00000 +0.04000 4.00000 +0.05000 4.00000 +0.06000 4.00000 +0.07000 4.00000 +0.08000 4.00000 +0.09000 4.00000 +0.00000 0.04000 +0.01000 0.04000 +0.02000 0.04000 +0.03000 0.04000 +0.04000 0.04000 +0.05000 0.05000 +0.06000 0.06000 +0.07000 0.06000 +0.08000 0.06000 +0.09000 0.06000 +0.00000 0.04000 +0.01000 0.04000 +0.02000 0.04000 +0.03000 0.04000 +0.04000 0.04000 +0.05000 0.05000 +0.06000 0.06000 +0.07000 0.06000 +0.08000 0.06000 +0.09000 0.06000 diff --git a/dbms/tests/queries/0_stateless/00805_round_down.sql b/dbms/tests/queries/0_stateless/00805_round_down.sql new file mode 100644 index 00000000000..bf25f7be952 --- /dev/null +++ b/dbms/tests/queries/0_stateless/00805_round_down.sql @@ -0,0 +1,19 @@ +SELECT number as x, roundDown(x, [0, 1, 2, 3, 4, 5]) FROM system.numbers LIMIT 10; +SELECT toUInt8(number) as x, roundDown(x, [-1.5, e(), pi(), 5.5]) FROM system.numbers LIMIT 10; +SELECT toInt32(number) as x, roundDown(x, [e(), pi(), pi(), e()]) FROM system.numbers LIMIT 10; +SELECT number as x, roundDown(x, [6, 5, 4]) FROM system.numbers LIMIT 10; +SELECT 1 as x, roundDown(x, [6, 5, 4]); + +SET send_logs_level = 'none'; +SELECT 1 as x, roundDown(x, []); -- { serverError 43 } +SELECT 1 as x, roundDown(x, emptyArrayUInt8()); -- { serverError 44 } +SELECT roundDown(number, [number]) FROM system.numbers LIMIT 10; -- { serverError 44 } + +SELECT 1 as x, roundDown(x, [1]); +SELECT 1 as x, roundDown(x, [1.5]); + +SELECT number % 10 as x, roundDown(x, (SELECT groupArray(number * 1.25) FROM numbers(100000))) FROM system.numbers LIMIT 10; + +SELECT toDecimal64(number, 5) / 100 as x, roundDown(x, [4, 5, 6]) FROM system.numbers LIMIT 10; +SELECT toDecimal64(number, 5) / 100 as x, roundDown(x, [toDecimal64(0.04, 5), toDecimal64(0.05, 5), toDecimal64(0.06, 5)]) FROM system.numbers LIMIT 10; +SELECT toDecimal64(number, 5) / 100 as x, roundDown(x, [toDecimal32(0.04, 2), toDecimal32(0.05, 2), toDecimal32(0.06, 2)]) FROM system.numbers LIMIT 10; diff --git a/docs/en/operations/table_engines/summingmergetree.md b/docs/en/operations/table_engines/summingmergetree.md index 587613c33d7..286507d8b9c 100644 --- a/docs/en/operations/table_engines/summingmergetree.md +++ b/docs/en/operations/table_engines/summingmergetree.md @@ -13,7 +13,7 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], ... -) ENGINE = MergeTree() +) ENGINE = SummingMergeTree() [PARTITION BY expr] [ORDER BY expr] [SAMPLE BY expr]