mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-27 10:02:01 +00:00
Merge remote-tracking branch 'upstream/master' into fix10
This commit is contained in:
commit
42f863a2ac
@ -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:
|
||||
|
155
CHANGELOG_RU.md
155
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:
|
||||
|
@ -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)
|
||||
|
@ -8,7 +8,6 @@
|
||||
#include <DataTypes/DataTypeNullable.h>
|
||||
#include <DataTypes/DataTypeNothing.h>
|
||||
#include <DataTypes/getLeastSupertype.h>
|
||||
#include <Interpreters/convertFieldToType.h>
|
||||
#include <Common/Exception.h>
|
||||
#include <ext/size.h>
|
||||
|
||||
|
@ -26,7 +26,7 @@ using DataTypes = std::vector<DataTypePtr>;
|
||||
/** 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.
|
||||
*/
|
||||
|
@ -20,6 +20,8 @@ void registerFunctionsHashing(FunctionFactory & factory)
|
||||
factory.registerFunction<FunctionIntHash32>();
|
||||
factory.registerFunction<FunctionIntHash64>();
|
||||
factory.registerFunction<FunctionURLHash>();
|
||||
factory.registerFunction<FunctionJavaHash>();
|
||||
factory.registerFunction<FunctionHiveHash>();
|
||||
factory.registerFunction<FunctionMurmurHash2_32>();
|
||||
factory.registerFunction<FunctionMurmurHash2_64>();
|
||||
factory.registerFunction<FunctionMurmurHash3_32>();
|
||||
|
@ -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<UInt32>(static_cast<Int8>(data[i]));
|
||||
return static_cast<Int32>(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<Int32>(0x7FFFFFFF & static_cast<UInt32>(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<MurmurHash2Impl64>;
|
||||
using FunctionMurmurHash3_32 = FunctionAnyHash<MurmurHash3Impl32>;
|
||||
using FunctionMurmurHash3_64 = FunctionAnyHash<MurmurHash3Impl64>;
|
||||
using FunctionMurmurHash3_128 = FunctionStringHashFixedString<MurmurHash3Impl128>;
|
||||
using FunctionJavaHash = FunctionAnyHash<JavaHashImpl>;
|
||||
using FunctionHiveHash = FunctionAnyHash<HiveHashImpl>;
|
||||
|
||||
}
|
||||
|
@ -10,6 +10,7 @@ void registerFunctionsRound(FunctionFactory & factory)
|
||||
factory.registerFunction<FunctionFloor>("floor", FunctionFactory::CaseInsensitive);
|
||||
factory.registerFunction<FunctionCeil>("ceil", FunctionFactory::CaseInsensitive);
|
||||
factory.registerFunction<FunctionTrunc>("trunc", FunctionFactory::CaseInsensitive);
|
||||
factory.registerFunction<FunctionRoundDown>();
|
||||
|
||||
/// Compatibility aliases.
|
||||
factory.registerAlias("ceiling", "ceil", FunctionFactory::CaseInsensitive);
|
||||
|
@ -1,14 +1,19 @@
|
||||
#pragma once
|
||||
|
||||
#include <Columns/ColumnArray.h>
|
||||
#include <Functions/FunctionUnaryArithmetic.h>
|
||||
#include <Functions/FunctionHelpers.h>
|
||||
#include <IO/WriteHelpers.h>
|
||||
#include <DataTypes/getLeastSupertype.h>
|
||||
#include <DataTypes/DataTypeArray.h>
|
||||
#include <Interpreters/castColumn.h>
|
||||
|
||||
#include <common/intExp.h>
|
||||
#include <cmath>
|
||||
#include <type_traits>
|
||||
#include <array>
|
||||
#include <ext/bit_cast.h>
|
||||
#include <algorithm>
|
||||
|
||||
#if __SSE4_1__
|
||||
#include <smmintrin.h>
|
||||
@ -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<FunctionRoundDown>(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<DataTypeArray>(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<DataTypeArray>(return_type), context);
|
||||
|
||||
const auto in = in_column.get();
|
||||
auto boundaries = typeid_cast<const ColumnConst &>(*array_column).getValue<Array>();
|
||||
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<UInt8>(in, out, boundaries)
|
||||
&& !executeNum<UInt16>(in, out, boundaries)
|
||||
&& !executeNum<UInt32>(in, out, boundaries)
|
||||
&& !executeNum<UInt64>(in, out, boundaries)
|
||||
&& !executeNum<Int8>(in, out, boundaries)
|
||||
&& !executeNum<Int16>(in, out, boundaries)
|
||||
&& !executeNum<Int32>(in, out, boundaries)
|
||||
&& !executeNum<Int64>(in, out, boundaries)
|
||||
&& !executeNum<Float32>(in, out, boundaries)
|
||||
&& !executeNum<Float64>(in, out, boundaries)
|
||||
&& !executeDecimal<Decimal32>(in, out, boundaries)
|
||||
&& !executeDecimal<Decimal64>(in, out, boundaries)
|
||||
&& !executeDecimal<Decimal128>(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 <typename T>
|
||||
bool executeNum(const IColumn * in_untyped, IColumn * out_untyped, const Array & boundaries)
|
||||
{
|
||||
const auto in = checkAndGetColumn<ColumnVector<T>>(in_untyped);
|
||||
auto out = typeid_cast<ColumnVector<T> *>(out_untyped);
|
||||
if (!in || !out)
|
||||
return false;
|
||||
|
||||
executeImplNumToNum(in->getData(), out->getData(), boundaries);
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
bool executeDecimal(const IColumn * in_untyped, IColumn * out_untyped, const Array & boundaries)
|
||||
{
|
||||
const auto in = checkAndGetColumn<ColumnDecimal<T>>(in_untyped);
|
||||
auto out = typeid_cast<ColumnDecimal<T> *>(out_untyped);
|
||||
if (!in || !out)
|
||||
return false;
|
||||
|
||||
executeImplNumToNum(in->getData(), out->getData(), boundaries);
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename Container>
|
||||
void executeImplNumToNum(const Container & src, Container & dst, const Array & boundaries)
|
||||
{
|
||||
using ValueType = typename Container::value_type;
|
||||
std::vector<ValueType> boundary_values(boundaries.size());
|
||||
for (size_t i = 0; i < boundaries.size(); ++i)
|
||||
boundary_values[i] = boundaries[i].get<ValueType>();
|
||||
|
||||
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"; };
|
||||
|
@ -9,6 +9,8 @@
|
||||
#include <Interpreters/InterpreterSelectWithUnionQuery.h>
|
||||
#include <Interpreters/ExecuteScalarSubqueriesVisitor.h>
|
||||
|
||||
#include <DataTypes/DataTypeAggregateFunction.h>
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
@ -98,6 +100,11 @@ void ExecuteScalarSubqueriesMatcher::visit(const ASTSubquery & subquery, ASTPtr
|
||||
size_t columns = block.columns();
|
||||
if (columns == 1)
|
||||
{
|
||||
if (typeid_cast<const DataTypeAggregateFunction*>(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<ASTLiteral>((*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<const DataTypeAggregateFunction*>(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<ASTLiteral>((*block.safeGetByPosition(i).column)[0]),
|
||||
block.safeGetByPosition(i).type->getName());
|
||||
|
@ -143,15 +143,17 @@ void ExpressionAnalyzer::analyzeAggregation()
|
||||
|
||||
ExpressionActionsPtr temp_actions = std::make_shared<ExpressionActions>(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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
|
@ -57,7 +57,7 @@ std::pair<Field, std::shared_ptr<const IDataType>> evaluateConstantExpression(co
|
||||
|
||||
ASTPtr evaluateConstantExpressionAsLiteral(const ASTPtr & node, const Context & context)
|
||||
{
|
||||
/// Branch with string in qery.
|
||||
/// Branch with string in query.
|
||||
if (typeid_cast<const ASTLiteral *>(node.get()))
|
||||
return node;
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
|
24
dbms/tests/performance/roundDown/roundDown.xml
Normal file
24
dbms/tests/performance/roundDown/roundDown.xml
Normal file
@ -0,0 +1,24 @@
|
||||
<test>
|
||||
<name>roundDown</name>
|
||||
<type>once</type>
|
||||
|
||||
<stop_conditions>
|
||||
<all_of>
|
||||
<total_time_ms>10000</total_time_ms>
|
||||
</all_of>
|
||||
<any_of>
|
||||
<average_speed_not_changing_for_ms>5000</average_speed_not_changing_for_ms>
|
||||
<total_time_ms>20000</total_time_ms>
|
||||
</any_of>
|
||||
</stop_conditions>
|
||||
|
||||
<main_metric>
|
||||
<avg_rows_per_second/>
|
||||
</main_metric>
|
||||
|
||||
<query>SELECT count() FROM system.numbers WHERE NOT ignore(roundDuration(rand() % 65536))</query>
|
||||
<query>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]))</query>
|
||||
<query>SELECT count() FROM system.numbers WHERE NOT ignore(roundAge(rand() % 100))</query>
|
||||
<query>SELECT count() FROM system.numbers WHERE NOT ignore(roundDown(rand() % 100, [0, 1, 18, 25, 35, 45, 55]))</query>
|
||||
<query>SELECT count() FROM system.numbers WHERE NOT ignore(roundDown(rand() % 65536, (SELECT groupArray(number) FROM numbers(65536))))</query>
|
||||
</test>
|
@ -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 }
|
||||
|
@ -0,0 +1,4 @@
|
||||
96354
|
||||
-676697544
|
||||
96354
|
||||
1470786104
|
@ -0,0 +1,4 @@
|
||||
select JavaHash('abc');
|
||||
select JavaHash('874293087');
|
||||
select HiveHash('abc');
|
||||
select HiveHash('874293087');
|
83
dbms/tests/queries/0_stateless/00805_round_down.reference
Normal file
83
dbms/tests/queries/0_stateless/00805_round_down.reference
Normal file
@ -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
|
19
dbms/tests/queries/0_stateless/00805_round_down.sql
Normal file
19
dbms/tests/queries/0_stateless/00805_round_down.sql
Normal file
@ -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;
|
@ -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]
|
||||
|
Loading…
Reference in New Issue
Block a user