mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-23 08:02:02 +00:00
Merge branch 'master' into decimal
This commit is contained in:
commit
866bec7cbe
@ -1,31 +0,0 @@
|
||||
## RU
|
||||
|
||||
## ClickHouse release 18.10.3, 2018-08-13
|
||||
|
||||
### Новые возможности:
|
||||
* поддержка межсерверной репликации по HTTPS
|
||||
* MurmurHash
|
||||
* ODBCDriver2 с поддержкой NULL-ов
|
||||
* поддержка UUID в ключевых колонках (экспериментально)
|
||||
|
||||
### Улучшения:
|
||||
* добавлена поддержка SETTINGS для движка Kafka
|
||||
* поддежка пустых кусков после мержей в движках Summing, Collapsing and VersionedCollapsing
|
||||
* удаление старых записей о полностью выполнившихся мутациях
|
||||
* исправлена логика REPLACE PARTITION для движка RplicatedMergeTree
|
||||
* добавлена системная таблица system.merge_tree_settings
|
||||
* в системную таблицу system.tables добавлены столбцы зависимостей: dependencies_database и dependencies_table
|
||||
* заменен аллокатор, теперь используется jemalloc вместо tcmalloc
|
||||
* улучшена валидация connection string ODBC
|
||||
* удалена поддержка CHECK TABLE для распределенных таблиц
|
||||
* добавлены stateful тесты (пока без данных)
|
||||
* добавлена опция конфига max_partition_size_to_drop
|
||||
* добавлена настройка output_format_json_escape_slashes
|
||||
* добавлена настройка max_fetch_partition_retries_count
|
||||
* добавлена настройка prefer_localhost_replica
|
||||
* добавлены libressl, unixodbc и mariadb-connector-c как сабмодули
|
||||
|
||||
### Исправление ошибок:
|
||||
* #2786
|
||||
* #2777
|
||||
* #2795
|
143
CHANGELOG_RU.md
143
CHANGELOG_RU.md
@ -1,3 +1,146 @@
|
||||
## ClickHouse release 18.12.13, 2018-09-10
|
||||
|
||||
### Новые возможности:
|
||||
|
||||
* Добавлен тип данных `DECIMAL(digits, scale)` (`Decimal32(scale)`, `Decimal64(scale)`, `Decimal128(scale)`). Возможность доступна под настройкой `allow_experimental_decimal_type`. #2846] #2970 #3008 #3047
|
||||
* Модификатор `WITH ROLLUP` для `GROUP BY` (также доступен синтаксис: `GROUP BY ROLLUP(...)`). #2948
|
||||
* Добавлена поддержка JOIN с табличной функцией. #2907
|
||||
* Автодополнение по нажатию Tab в clickhouse-client. Sergey Shcherbin #2447
|
||||
* Нажатие Ctrl+C в clickhouse-client очищает запрос, если он был введён #2877
|
||||
* Добавлена настройка `join_default_strictness` (значения `''`, `'any'`, `'all'`). Её использование позволяет не указывать `ANY` или `ALL` для `JOIN` #2982
|
||||
* В каждой строчке лога сервера, относящейся к обработке запроса, выводится идентификатор запроса. #2482
|
||||
* Возможность получения логов выполнения запроса в clickhouse-client (настройка `send_logs_level`). При распределённой обработке запроса, логи отправляются каскадно со всех серверов. #2482
|
||||
* В таблицах `system.query_log` и `system.processes` (`SHOW PROCESSLIST`) появилась информация о всех изменённых настройках при выполнении запроса (вложенная структура данных `Settings`). Добавлена настройка `log_query_settings`. #2482
|
||||
* В таблицах `system.query_log` и `system.processes` появилась информация о номерах потоков, участвующих в исполнении запроса (столбец `thread_numbers`). #2482
|
||||
* Добавлены счётчики `ProfileEvents`, измеряющие время, потраченное на чтение и запись по сети; чтение и запись на диск; количество сетевых ошибок; время потраченное на ожидании при ограничении сетевой полосы. #2482
|
||||
* Добавлены счётчики `ProfileEvents`, содержащие системные метрики из rusage (позволяющие получить информацию об использовании CPU в userspace и ядре, page faults, context switches) а также метрики taskstats (позволяющие получить информацию о времени ожидания IO, CPU, а также количество прочитанных и записанных данных с учётом и без учёта page cache). #2482
|
||||
* Счётчики `ProfileEvents` учитываются не только глобально, но и на каждый запрос, а также на каждый поток выполнения запроса, что позволяет детально профилировать потребление ресурсов отдельными запросами. #2482
|
||||
* Добавлена таблица `system.query_thread_log`, содержащая информацию о каждом потоке выполнения запроса. Добавлена настройка `log_query_threads`. #2482
|
||||
* В таблицах `system.metrics` и `system.events` появилась встроенная документация.
|
||||
* Добавлена функция `arrayEnumerateDense`.
|
||||
* Добавлены функции `arrayCumSumNonNegative` и `arrayDifference`.
|
||||
* Добавлена агрегатная функция `retention`.
|
||||
* Возможность сложения (слияния) состояний агрегатных функций с помощью оператора плюс, а также умножения состояний агрегатных функций на целую неотрицательную константу.
|
||||
* В таблицах семейства MergeTree добавлен виртуальный столбец `_partition_id` #3089
|
||||
|
||||
### Экспериментальные возможности:
|
||||
|
||||
* Добавлен тип данных `LowCardinality(T)`. Тип данных автоматически создаёт локальный словарь значений и позволяет обрабатывать данные без распаковки словаря.
|
||||
* Добавлен кэш JIT-скомпилированных функций, а также счётчик числа использований перед компиляцией. Возможность JIT-компиляции выражений включается настройкой `compile_expressions`.
|
||||
|
||||
### Улучшения:
|
||||
|
||||
* Исправлена проблема неограниченного накопления лога репликации в случае наличия заброшенных реплик. Добавлен режим эффективного восстановления реплик после длительного отставания.
|
||||
* Увеличена производительность при выполнении `GROUP BY` в случае, если есть несколько полей агрегации, одно из которых строковое, а другие - фиксированной длины.
|
||||
* Увеличена производительность при использовании `PREWHERE` и при неявном переносе выражений в `PREWHERE`.
|
||||
* Увеличена производительность парсинга текстовых форматов (`CSV`, `TSV`) Amos Bird
|
||||
* Увеличена производительность чтения строк и массивов в бинарных форматах Amos Bird
|
||||
* Увеличена производительность и уменьшено потребление памяти в запросах к таблицам `system.tables` и `system.columns` в случае наличия очень большого количества таблиц на одном сервере.
|
||||
* Исправлена проблема низкой производительности в случае наличия большого потока запросов, для которых возвращается ошибка (в `perf top` видна функция `_dl_addr`, при этом сервер использует мало CPU).
|
||||
* Прокидывание условий внутрь View (при включенной настройке `enable_optimize_predicate_expression`).
|
||||
* Доработки недостающей функциональности для типа данных `UUID`.
|
||||
* Тип данных `UUID` поддержан в словарях.
|
||||
* Функция `visitParamExtractRaw` корректно работает с вложенными структурами.
|
||||
* При использовании настройки `input_format_skip_unknown_fields` корректно работает пропуск значений-объектов в формате `JSONEachRow`.
|
||||
* Для выражения `CASE` с условиями, появилась возможность не указывать `ELSE`, что эквивалентно `ELSE NULL` #2920
|
||||
* Возможность конфигурирования operation timeout при работе с ZooKeeper.
|
||||
* Возможность указания смещения для `LIMIT n, m` в виде `LIMIT n OFFSET m` #2840
|
||||
* Возможность использования синтаксиса `SELECT TOP n` в качестве альтернативы для `LIMIT` #2840
|
||||
* Увеличен размер очереди записи в системные таблицы, что позволяет уменьшить количество ситуаций `SystemLog queue is full`.
|
||||
* В агрегатной функции `windowFunnel` добавлена поддержка событий, подходящих под несколько условий.
|
||||
* Возможность использования дублирующихся столбцов в секции `USING` для `JOIN` #3006
|
||||
* Для форматов `Pretty` введено ограничение выравнивания столбцов по ширине. Настройка `output_format_pretty_max_column_pad_width`. В случае более широкого значения, оно всё ещё будет выведено целиком, но остальные ячейки таблицы не будут излишне широкими.
|
||||
* В табличной функции `odbc` добавлена возможность указания имени базы данных/схемы.
|
||||
* Добавлена возможность использования имени пользователя, заданного в конфигурационном файле `clickhouse-client`.
|
||||
* Счётчик `ZooKeeperExceptions` разделён на три счётчика `ZooKeeperUserExceptions`, `ZooKeeperHardwareExceptions`, `ZooKeeperOtherExceptions`.
|
||||
* Запросы `ALTER DELETE` работают для материализованных представлений.
|
||||
* Добавлена рандомизация во времени периодического запуска cleanup thread для таблиц типа `ReplicatedMergeTree`, чтобы избежать периодических всплесков нагрузки в случае очень большого количества таблиц типа `ReplicatedMergeTree`.
|
||||
|
||||
### Исправление ошибок:
|
||||
|
||||
* Исправлена ошибка в работе таблиц типа `Dictionary`.
|
||||
* Исправлена ошибка при мерже данных таблиц типа `CollapsingMergeTree`, если один из кусков данных пустой (такие куски, в свою очередь, образуются при слиянии или при `ALTER DELETE` в случае удаления всех данных), и для слияния был выбран алгоритм `vertical`.
|
||||
* Исправлен race condition при `DROP` или `TRUNCATE` таблиц типа Memory при одновременном `SELECT`, который мог приводить к падениям сервера.
|
||||
* Исправлена возможность потери данных при вставке в `Replicated` таблицы в случае получения ошибки `Session expired` (потеря данных может быть обнаружена по метрике `ReplicatedDataLoss`).
|
||||
* Исправлен segfault при `JOIN ... ON`.
|
||||
* Исправлена ошибка поиска имён столбцов в случае, если выражение `WHERE` состоит целиком из квалифицированного имени столбца, как например `WHERE table.column`.
|
||||
* Исправлена ошибка вида "Not found column" при выполнении распределённых запросов в случае, если с удалённого сервера запрашивается единственный столбец, представляющий собой выражение IN с подзапросом.
|
||||
* Исправлена ошибка `Block structure mismatch in UNION stream: different number of columns`, возникающая при распределённых запросах, если один из шардов локальный, а другой - нет, и если при этом срабатывает оптимизация переноса в `PREWHERE`.
|
||||
* Исправлена работа функции `pointInPolygon` для некоторого случая невыпуклых полигонов.
|
||||
* Исправлен некорректный результат при сравнении `nan` с целыми числами.
|
||||
* Исправлена ошибка в библиотеке `zlib-ng`, которая могла приводить к segfault в редких случаях.
|
||||
* Исправлена утечка памяти при вставке в таблицу со столбцами типа `AggregateFunction`, если состояние агрегатной функции нетривиальное (выделяет память отдельно), и если в одном запросе на вставку получается несколько маленьких блоков.
|
||||
* Исправлен race condition при одновременном создании и удалении одной и той же таблицы типа `Buffer` или `MergeTree`.
|
||||
* Исправлена возможность segfault при сравнении кортежей из некоторых нетривиальных типов, таких как, например, кортежей.
|
||||
* Исправлена возможность segfault при выполнении некоторых запросов `ON CLUSTER`.
|
||||
* Исправлена ошибка в функции `arrayDistinct` в случае `Nullable` элементов массивов #2845
|
||||
* Возможность `enable_optimize_predicate_expression` корректно поддерживает случаи с `SELECT *`.
|
||||
* Исправлена возможность segfault при переинициализации сессии с ZooKeeper.
|
||||
* Исправлена возможность блокировки при взаимодействии с ZooKeeper.
|
||||
* Исправлен некорректный код суммирования вложенных структур данных в `SummingMergeTree`.
|
||||
* При выделении памяти для состояний агрегатных функций, корректно учитывается выравнивание, что позволяет использовать при реализации состояний агрегатных функций операции, для которых выравнивание является необходимым.
|
||||
|
||||
### Исправления безопасности:
|
||||
|
||||
* Безопасная работа с ODBC источниками данных. Взаимодействие с ODBC драйверами выполняется через отдельный процесс `clickhouse-odbc-bridge`. Ошибки в сторонних ODBC драйверах теперь не приводят к проблемам со стабильностью сервера или уязвимостям.
|
||||
* Исправлена некорректная валидация пути к файлу в табличной функции `catBoostPool`.
|
||||
* Содержимое системных таблиц (`tables`, `databases`, `parts`, `columns`, `parts_columns`, `merges`, `mutations`, `replicas`, `replication_queue`) фильтруется согласно конфигурации доступа к базам данных для пользователя (`allow_databases`).
|
||||
|
||||
### Изменения сборки:
|
||||
|
||||
* Добавлен покоммитный запуск большинства интеграционных тестов.
|
||||
* Добавлен покоммитный запуск проверки стиля кода.
|
||||
* Корректный выбор реализации `memcpy` при сборке на CentOS7 / Fedora.
|
||||
* При сборке с помощью clang добавлены некоторые warnings из `-Weverything` в дополнение к обычным `-Wall -Wextra -Werror`.
|
||||
* При debug сборке используется debug вариант `jemalloc`.
|
||||
* Абстрагирован интерфейс библиотеки для взаимодействия с ZooKeeper.
|
||||
|
||||
|
||||
## ClickHouse release 18.10.3, 2018-08-13
|
||||
|
||||
### Новые возможности:
|
||||
* поддержка межсерверной репликации по HTTPS
|
||||
* MurmurHash
|
||||
* Поддержка Nullable типов в ODBC драйвере ClickHouse (формат вывода ODBCDriver2).
|
||||
* поддержка UUID в ключевых колонках.
|
||||
|
||||
### Улучшения:
|
||||
* Удаление кластеров без перезагрузки сервера при их удалении из конфигурационных файлов. #2777
|
||||
* Удаление внешних словарей без перезагрузки сервера при их удалении из конфигурационных файлов. #2779
|
||||
* Добавлена поддержка `SETTINGS` для движка таблиц `Kafka`.
|
||||
* Доработки для типа данных `UUID` (не полностью) Simon Podlipsky.
|
||||
* Поддежка пустых кусков после мержей в движках `SummingMergeTree`, `CollapsingMergeTree` and `VersionedCollapsingMergeTree`
|
||||
* Удаление старых записей о полностью выполнившихся мутациях (`ALTER DELETE`).
|
||||
* Исправлена логика `REPLACE PARTITION` для движка `ReplicatedMergeTree`
|
||||
* Добавлена таблица `system.merge_tree_settings` Kirill Shvakov
|
||||
* В таблицу `system.tables` добавлены столбцы зависимостей: `dependencies_database` и `dependencies_table`.
|
||||
* Добавлена опция конфига `max_partition_size_to_drop` #2782
|
||||
* Добавлена настройка `output_format_json_escape_forward_slashes`
|
||||
* Добавлена настройка `max_fetch_partition_retries_count`
|
||||
* Добавлена настройка `prefer_localhost_replica`, позволяющая отключить предпочтение локальной реплики и хождение на локальную реплику без межпроцессного взаимодействия.
|
||||
* Агрегатная функция `quantileExact` возвращает `nan` в случае агрегации по пустому множеству `Float32`/`Float64` типов.
|
||||
|
||||
### Исправление ошибок:
|
||||
* Убрано излишнее экранирование параметров connection string для ODBC, котрое приводило к невозможности соединения. Ошибка возникла в версии 18.6.0.
|
||||
* Исправлена логика обработки команд на `REPLACE PARTITION` в очереди репликации. Неправильная логика могла приводить к тому, что при наличии двух `REPLACE` одной и той же партиции, один из них оставался в очереди репликации и не мог выполниться.
|
||||
* Исправлена ошибка при мерже, если все куски были пустыми (такие куски, в свою очередь, образуются при слиянии или при `ALTER DELETE` в случае удаления всех данных).
|
||||
* Исправлена ошибка при параллельной записи в таблицы типа `Set` или `Join`. Amos Bird.
|
||||
* Исправлена ошибка `Block structure mismatch in UNION stream: different number of columns`, возникающая при запросах с `UNION ALL` внутри подзапроса, в случае, если один из `SELECT` запросов содержит дублирующиеся имена столбцов. zhang2014
|
||||
* Исправлена утечка памяти в случае исключения при соединении с MySQL сервером.
|
||||
* Исправлен некорректный код возврата clickhouse-client в случае ошибочного запроса.
|
||||
* #2786
|
||||
* #2777
|
||||
* #2795
|
||||
|
||||
### Обратно несовместимые изменения
|
||||
* Убрана поддержка запросов CHECK TABLE для Distributed таблиц.
|
||||
|
||||
### Изменения сборки:
|
||||
* Заменен аллокатор, теперь используется jemalloc вместо tcmalloc.
|
||||
* Добавлены libressl, unixodbc и mariadb-connector-c как сабмодули.
|
||||
* В репозиторий добавлены файлы функциональных тестов, рассчитывающих на наличие тестовых данных (пока без самих тестовых данных).
|
||||
|
||||
|
||||
## ClickHouse release 18.6.0, 2018-08-02
|
||||
|
||||
### Новые возможности:
|
||||
|
@ -2,10 +2,10 @@
|
||||
set(VERSION_REVISION 54407 CACHE STRING "")
|
||||
set(VERSION_MAJOR 18 CACHE STRING "")
|
||||
set(VERSION_MINOR 12 CACHE STRING "")
|
||||
set(VERSION_PATCH 11 CACHE STRING "")
|
||||
set(VERSION_GITHASH 1d28a9c510120b07f0719b2f33ccbc21be1e339d CACHE STRING "")
|
||||
set(VERSION_DESCRIBE v18.12.11-testing CACHE STRING "")
|
||||
set(VERSION_STRING 18.12.11 CACHE STRING "")
|
||||
set(VERSION_PATCH 13 CACHE STRING "")
|
||||
set(VERSION_GITHASH c6bb8a340a45474f1009af4eb665506e16808672 CACHE STRING "")
|
||||
set(VERSION_DESCRIBE v18.12.13-testing CACHE STRING "")
|
||||
set(VERSION_STRING 18.12.13 CACHE STRING "")
|
||||
# end of autochange
|
||||
|
||||
set(VERSION_EXTRA "" CACHE STRING "")
|
||||
|
@ -1,6 +1,6 @@
|
||||
#include <AggregateFunctions/AggregateFunctionArray.h>
|
||||
#include <AggregateFunctions/AggregateFunctionCombinatorFactory.h>
|
||||
|
||||
#include <Common/typeid_cast.h>
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
@ -1,7 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <Columns/ColumnArray.h>
|
||||
#include <Common/typeid_cast.h>
|
||||
#include <DataTypes/DataTypeArray.h>
|
||||
#include <AggregateFunctions/IAggregateFunction.h>
|
||||
#include <IO/WriteHelpers.h>
|
||||
@ -32,7 +31,7 @@ public:
|
||||
: nested_func(nested_), num_arguments(arguments.size())
|
||||
{
|
||||
for (const auto & type : arguments)
|
||||
if (!typeid_cast<const DataTypeArray *>(type.get()))
|
||||
if (!isArray(type))
|
||||
throw Exception("All arguments for aggregate function " + getName() + " must be arrays", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
#include <AggregateFunctions/AggregateFunctionForEach.h>
|
||||
#include <AggregateFunctions/AggregateFunctionCombinatorFactory.h>
|
||||
#include <Common/typeid_cast.h>
|
||||
|
||||
|
||||
namespace DB
|
||||
|
@ -1,7 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <Columns/ColumnArray.h>
|
||||
#include <Common/typeid_cast.h>
|
||||
#include <DataTypes/DataTypeArray.h>
|
||||
#include <AggregateFunctions/IAggregateFunction.h>
|
||||
|
||||
@ -106,7 +105,7 @@ public:
|
||||
throw Exception("Aggregate function " + getName() + " require at least one argument", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
|
||||
|
||||
for (const auto & type : arguments)
|
||||
if (!typeid_cast<const DataTypeArray *>(type.get()))
|
||||
if (!isArray(type))
|
||||
throw Exception("All arguments for aggregate function " + getName() + " must be arrays", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
||||
}
|
||||
|
||||
|
@ -20,8 +20,9 @@ namespace
|
||||
template <template <typename, typename> class AggregateFunctionTemplate, typename Data, typename ... TArgs>
|
||||
static IAggregateFunction * createWithNumericOrTimeType(const IDataType & argument_type, TArgs && ... args)
|
||||
{
|
||||
if (typeid_cast<const DataTypeDate *>(&argument_type)) return new AggregateFunctionTemplate<UInt16, Data>(std::forward<TArgs>(args)...);
|
||||
if (typeid_cast<const DataTypeDateTime *>(&argument_type)) return new AggregateFunctionTemplate<UInt32, Data>(std::forward<TArgs>(args)...);
|
||||
WhichDataType which(argument_type);
|
||||
if (which.idx == TypeIndex::Date) return new AggregateFunctionTemplate<UInt16, Data>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::DateTime) return new AggregateFunctionTemplate<UInt32, Data>(std::forward<TArgs>(args)...);
|
||||
return createWithNumericType<AggregateFunctionTemplate, Data, TArgs...>(argument_type, std::forward<TArgs>(args)...);
|
||||
}
|
||||
|
||||
@ -32,7 +33,8 @@ inline AggregateFunctionPtr createAggregateFunctionGroupArrayImpl(const DataType
|
||||
if (auto res = createWithNumericOrTimeType<GroupArrayNumericImpl, has_limit>(*argument_type, argument_type, std::forward<TArgs>(args)...))
|
||||
return AggregateFunctionPtr(res);
|
||||
|
||||
if (typeid_cast<const DataTypeString *>(argument_type.get()))
|
||||
WhichDataType which(argument_type);
|
||||
if (which.idx == TypeIndex::String)
|
||||
return std::make_shared<GroupArrayGeneralListImpl<GroupArrayListNodeString, has_limit::value>>(argument_type, std::forward<TArgs>(args)...);
|
||||
|
||||
return std::make_shared<GroupArrayGeneralListImpl<GroupArrayListNodeGeneral, has_limit::value>>(argument_type, std::forward<TArgs>(args)...);
|
||||
|
@ -26,8 +26,9 @@ class AggregateFunctionGroupUniqArrayDateTime : public AggregateFunctionGroupUni
|
||||
|
||||
static IAggregateFunction * createWithExtraTypes(const DataTypePtr & argument_type)
|
||||
{
|
||||
if (typeid_cast<const DataTypeDate *>(argument_type.get())) return new AggregateFunctionGroupUniqArrayDate;
|
||||
else if (typeid_cast<const DataTypeDateTime *>(argument_type.get())) return new AggregateFunctionGroupUniqArrayDateTime;
|
||||
WhichDataType which(argument_type);
|
||||
if (which.idx == TypeIndex::Date) return new AggregateFunctionGroupUniqArrayDate;
|
||||
else if (which.idx == TypeIndex::DateTime) return new AggregateFunctionGroupUniqArrayDateTime;
|
||||
else
|
||||
{
|
||||
/// Check that we can use plain version of AggreagteFunctionGroupUniqArrayGeneric
|
||||
|
@ -21,7 +21,7 @@ public:
|
||||
throw Exception("Incorrect number of arguments for aggregate function with " + getName() + " suffix",
|
||||
ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
|
||||
|
||||
if (!typeid_cast<const DataTypeUInt8 *>(arguments.back().get()))
|
||||
if (!isUInt8(arguments.back()))
|
||||
throw Exception("Illegal type " + arguments.back()->getName() + " of last argument for aggregate function with " + getName() + " suffix",
|
||||
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
||||
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
#include <DataTypes/DataTypesNumber.h>
|
||||
#include <Columns/ColumnsNumber.h>
|
||||
#include <Common/typeid_cast.h>
|
||||
#include <AggregateFunctions/IAggregateFunction.h>
|
||||
|
||||
|
||||
@ -34,7 +33,7 @@ public:
|
||||
if (num_arguments == 0)
|
||||
throw Exception("Aggregate function " + getName() + " require at least one argument", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
|
||||
|
||||
if (!typeid_cast<const DataTypeUInt8 *>(types.back().get()))
|
||||
if (!isUInt8(types.back()))
|
||||
throw Exception("Last argument for aggregate function " + getName() + " must be UInt8", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
||||
}
|
||||
|
||||
|
@ -6,7 +6,6 @@
|
||||
#include <Columns/ColumnVector.h>
|
||||
#include <Columns/ColumnString.h>
|
||||
#include <DataTypes/IDataType.h>
|
||||
#include <Common/typeid_cast.h>
|
||||
#include <common/StringRef.h>
|
||||
|
||||
#include <AggregateFunctions/IAggregateFunction.h>
|
||||
|
@ -29,17 +29,17 @@ AggregateFunctionPtr createAggregateFunctionQuantile(const std::string & name, c
|
||||
|
||||
const DataTypePtr & argument_type = argument_types[0];
|
||||
|
||||
WhichDataType which(argument_type);
|
||||
#define CREATE(TYPE) \
|
||||
if (typeid_cast<const DataType ## TYPE *>(argument_type.get())) \
|
||||
if (which.idx == TypeIndex::TYPE) \
|
||||
return std::make_shared<AggregateFunctionQuantile<TYPE, Data<TYPE>, Name, have_second_arg, FloatReturnType, returns_many>>(argument_type, params);
|
||||
|
||||
FOR_NUMERIC_TYPES(CREATE)
|
||||
#undef CREATE
|
||||
|
||||
if (typeid_cast<const DataTypeDate *>(argument_type.get()))
|
||||
if (which.idx == TypeIndex::Date)
|
||||
return std::make_shared<AggregateFunctionQuantile<
|
||||
DataTypeDate::FieldType, Data<DataTypeDate::FieldType>, Name, have_second_arg, void, returns_many>>(argument_type, params);
|
||||
if (typeid_cast<const DataTypeDateTime *>(argument_type.get()))
|
||||
if (which.idx == TypeIndex::DateTime)
|
||||
return std::make_shared<AggregateFunctionQuantile<
|
||||
DataTypeDateTime::FieldType, Data<DataTypeDateTime::FieldType>, Name, have_second_arg, void, returns_many>>(argument_type, params);
|
||||
|
||||
|
@ -10,7 +10,6 @@
|
||||
#include <IO/ReadHelpers.h>
|
||||
#include <IO/WriteHelpers.h>
|
||||
#include <Common/ArenaAllocator.h>
|
||||
#include <Common/typeid_cast.h>
|
||||
#include <ext/range.h>
|
||||
#include <bitset>
|
||||
|
||||
@ -81,7 +80,7 @@ public:
|
||||
for (const auto i : ext::range(0, arguments.size()))
|
||||
{
|
||||
auto cond_arg = arguments[i].get();
|
||||
if (!typeid_cast<const DataTypeUInt8 *>(cond_arg))
|
||||
if (!isUInt8(cond_arg))
|
||||
throw Exception{"Illegal type " + cond_arg->getName() + " of argument " + toString(i) + " of aggregate function "
|
||||
+ getName() + ", must be UInt8",
|
||||
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT};
|
||||
|
@ -6,7 +6,6 @@
|
||||
#include <Columns/ColumnsNumber.h>
|
||||
#include <ext/range.h>
|
||||
#include <Common/PODArray.h>
|
||||
#include <Common/typeid_cast.h>
|
||||
#include <IO/ReadHelpers.h>
|
||||
#include <IO/WriteHelpers.h>
|
||||
#include <bitset>
|
||||
@ -155,7 +154,7 @@ public:
|
||||
ErrorCodes::TOO_MANY_ARGUMENTS_FOR_FUNCTION};
|
||||
|
||||
const auto time_arg = arguments.front().get();
|
||||
if (!typeid_cast<const DataTypeDateTime *>(time_arg))
|
||||
if (!WhichDataType(time_arg).isDateTime())
|
||||
throw Exception{"Illegal type " + time_arg->getName() + " of first argument of aggregate function "
|
||||
+ derived().getName() + ", must be DateTime",
|
||||
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT};
|
||||
@ -163,7 +162,7 @@ public:
|
||||
for (const auto i : ext::range(1, arg_count))
|
||||
{
|
||||
const auto cond_arg = arguments[i].get();
|
||||
if (!typeid_cast<const DataTypeUInt8 *>(cond_arg))
|
||||
if (!isUInt8(cond_arg))
|
||||
throw Exception{"Illegal type " + cond_arg->getName() + " of argument " + toString(i + 1) +
|
||||
" of aggregate function " + derived().getName() + ", must be UInt8",
|
||||
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT};
|
||||
|
@ -37,8 +37,9 @@ class AggregateFunctionTopKDateTime : public AggregateFunctionTopK<DataTypeDateT
|
||||
|
||||
static IAggregateFunction * createWithExtraTypes(const DataTypePtr & argument_type, UInt64 threshold)
|
||||
{
|
||||
if (typeid_cast<const DataTypeDate *>(argument_type.get())) return new AggregateFunctionTopKDate(threshold);
|
||||
if (typeid_cast<const DataTypeDateTime *>(argument_type.get())) return new AggregateFunctionTopKDateTime(threshold);
|
||||
WhichDataType which(argument_type);
|
||||
if (which.idx == TypeIndex::Date) return new AggregateFunctionTopKDate(threshold);
|
||||
if (which.idx == TypeIndex::DateTime) return new AggregateFunctionTopKDateTime(threshold);
|
||||
|
||||
/// Check that we can use plain version of AggregateFunctionTopKGeneric
|
||||
if (argument_type->isValueUnambiguouslyRepresentedInContiguousMemoryRegion())
|
||||
|
@ -45,17 +45,18 @@ AggregateFunctionPtr createAggregateFunctionUniq(const std::string & name, const
|
||||
|
||||
AggregateFunctionPtr res(createWithNumericType<AggregateFunctionUniq, Data>(*argument_types[0]));
|
||||
|
||||
WhichDataType which(argument_type);
|
||||
if (res)
|
||||
return res;
|
||||
else if (typeid_cast<const DataTypeDate *>(&argument_type))
|
||||
else if (which.isDate())
|
||||
return std::make_shared<AggregateFunctionUniq<DataTypeDate::FieldType, Data>>();
|
||||
else if (typeid_cast<const DataTypeDateTime *>(&argument_type))
|
||||
else if (which.isDateTime())
|
||||
return std::make_shared<AggregateFunctionUniq<DataTypeDateTime::FieldType, Data>>();
|
||||
else if (typeid_cast<const DataTypeString *>(&argument_type) || typeid_cast<const DataTypeFixedString *>(&argument_type))
|
||||
else if (which.isStringOrFixedString())
|
||||
return std::make_shared<AggregateFunctionUniq<String, Data>>();
|
||||
else if (typeid_cast<const DataTypeUUID *>(&argument_type))
|
||||
else if (which.isUUID())
|
||||
return std::make_shared<AggregateFunctionUniq<DataTypeUUID::FieldType, Data>>();
|
||||
else if (typeid_cast<const DataTypeTuple *>(&argument_type))
|
||||
else if (which.isTuple())
|
||||
{
|
||||
if (use_exact_hash_function)
|
||||
return std::make_shared<AggregateFunctionUniqVariadic<DataForVariadic, true, true>>(argument_types);
|
||||
@ -90,17 +91,18 @@ AggregateFunctionPtr createAggregateFunctionUniq(const std::string & name, const
|
||||
|
||||
AggregateFunctionPtr res(createWithNumericType<AggregateFunctionUniq, Data>(*argument_types[0]));
|
||||
|
||||
WhichDataType which(argument_type);
|
||||
if (res)
|
||||
return res;
|
||||
else if (typeid_cast<const DataTypeDate *>(&argument_type))
|
||||
else if (which.isDate())
|
||||
return std::make_shared<AggregateFunctionUniq<DataTypeDate::FieldType, Data<DataTypeDate::FieldType>>>();
|
||||
else if (typeid_cast<const DataTypeDateTime *>(&argument_type))
|
||||
else if (which.isDateTime())
|
||||
return std::make_shared<AggregateFunctionUniq<DataTypeDateTime::FieldType, Data<DataTypeDateTime::FieldType>>>();
|
||||
else if (typeid_cast<const DataTypeString *>(&argument_type) || typeid_cast<const DataTypeFixedString *>(&argument_type))
|
||||
else if (which.isStringOrFixedString())
|
||||
return std::make_shared<AggregateFunctionUniq<String, Data<String>>>();
|
||||
else if (typeid_cast<const DataTypeUUID *>(&argument_type))
|
||||
else if (which.isUUID())
|
||||
return std::make_shared<AggregateFunctionUniq<DataTypeUUID::FieldType, Data<DataTypeUUID::FieldType>>>();
|
||||
else if (typeid_cast<const DataTypeTuple *>(&argument_type))
|
||||
else if (which.isTuple())
|
||||
{
|
||||
if (use_exact_hash_function)
|
||||
return std::make_shared<AggregateFunctionUniqVariadic<DataForVariadic, true, true>>(argument_types);
|
||||
|
@ -54,17 +54,18 @@ AggregateFunctionPtr createAggregateFunctionUniqUpTo(const std::string & name, c
|
||||
|
||||
AggregateFunctionPtr res(createWithNumericType<AggregateFunctionUniqUpTo>(*argument_types[0], threshold));
|
||||
|
||||
WhichDataType which(argument_type);
|
||||
if (res)
|
||||
return res;
|
||||
else if (typeid_cast<const DataTypeDate *>(&argument_type))
|
||||
else if (which.isDate())
|
||||
return std::make_shared<AggregateFunctionUniqUpTo<DataTypeDate::FieldType>>(threshold);
|
||||
else if (typeid_cast<const DataTypeDateTime *>(&argument_type))
|
||||
else if (which.isDateTime())
|
||||
return std::make_shared<AggregateFunctionUniqUpTo<DataTypeDateTime::FieldType>>(threshold);
|
||||
else if (typeid_cast<const DataTypeString *>(&argument_type) || typeid_cast<const DataTypeFixedString*>(&argument_type))
|
||||
else if (which.isStringOrFixedString())
|
||||
return std::make_shared<AggregateFunctionUniqUpTo<String>>(threshold);
|
||||
else if (typeid_cast<const DataTypeUUID *>(&argument_type))
|
||||
else if (which.isUUID())
|
||||
return std::make_shared<AggregateFunctionUniqUpTo<DataTypeUUID::FieldType>>(threshold);
|
||||
else if (typeid_cast<const DataTypeTuple *>(&argument_type))
|
||||
else if (which.isTuple())
|
||||
{
|
||||
if (use_exact_hash_function)
|
||||
return std::make_shared<AggregateFunctionUniqUpToVariadic<true, true>>(argument_types, threshold);
|
||||
|
@ -9,7 +9,6 @@
|
||||
#include <IO/ReadHelpers.h>
|
||||
#include <IO/WriteHelpers.h>
|
||||
#include <Common/ArenaAllocator.h>
|
||||
#include <Common/typeid_cast.h>
|
||||
#include <ext/range.h>
|
||||
|
||||
#include <AggregateFunctions/IAggregateFunction.h>
|
||||
@ -190,14 +189,14 @@ public:
|
||||
AggregateFunctionWindowFunnel(const DataTypes & arguments, const Array & params)
|
||||
{
|
||||
const auto time_arg = arguments.front().get();
|
||||
if (!typeid_cast<const DataTypeDateTime *>(time_arg) && !typeid_cast<const DataTypeUInt32 *>(time_arg))
|
||||
if (!WhichDataType(time_arg).isDateTime() && !WhichDataType(time_arg).isUInt32())
|
||||
throw Exception{"Illegal type " + time_arg->getName() + " of first argument of aggregate function " + getName()
|
||||
+ ", must be DateTime or UInt32"};
|
||||
|
||||
for (const auto i : ext::range(1, arguments.size()))
|
||||
{
|
||||
auto cond_arg = arguments[i].get();
|
||||
if (!typeid_cast<const DataTypeUInt8 *>(cond_arg))
|
||||
if (!isUInt8(cond_arg))
|
||||
throw Exception{"Illegal type " + cond_arg->getName() + " of argument " + toString(i + 1) + " of aggregate function "
|
||||
+ getName() + ", must be UInt8",
|
||||
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT};
|
||||
|
@ -1,17 +1,8 @@
|
||||
#pragma once
|
||||
|
||||
#include <Common/typeid_cast.h>
|
||||
#include <DataTypes/DataTypesNumber.h>
|
||||
#include <DataTypes/DataTypeEnum.h>
|
||||
#include <DataTypes/IDataType.h>
|
||||
#include <AggregateFunctions/IAggregateFunction.h>
|
||||
|
||||
|
||||
#define FOR_UNSIGNED_INTEGER_TYPES(M) \
|
||||
M(UInt8) \
|
||||
M(UInt16) \
|
||||
M(UInt32) \
|
||||
M(UInt64)
|
||||
|
||||
#define FOR_NUMERIC_TYPES(M) \
|
||||
M(UInt8) \
|
||||
M(UInt16) \
|
||||
@ -24,20 +15,6 @@
|
||||
M(Float32) \
|
||||
M(Float64)
|
||||
|
||||
#define FOR_NUMERIC_TYPES_AND_ENUMS(M) \
|
||||
M(UInt8, DataTypeUInt8) \
|
||||
M(UInt16, DataTypeUInt16) \
|
||||
M(UInt32, DataTypeUInt32) \
|
||||
M(UInt64, DataTypeUInt64) \
|
||||
M(Int8, DataTypeInt8) \
|
||||
M(Int16, DataTypeInt16) \
|
||||
M(Int32, DataTypeInt32) \
|
||||
M(Int64, DataTypeInt64) \
|
||||
M(Float32, DataTypeFloat32) \
|
||||
M(Float64, DataTypeFloat64) \
|
||||
M(UInt8, DataTypeEnum8) \
|
||||
M(UInt16, DataTypeEnum16)
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
@ -46,30 +23,39 @@ namespace DB
|
||||
template <template <typename, typename ... TArgs> class AggregateFunctionTemplate, typename ... TArgs>
|
||||
static IAggregateFunction * createWithNumericType(const IDataType & argument_type, TArgs && ... args)
|
||||
{
|
||||
#define DISPATCH(FIELDTYPE, DATATYPE) \
|
||||
if (typeid_cast<const DATATYPE *>(&argument_type)) return new AggregateFunctionTemplate<FIELDTYPE>(std::forward<TArgs>(args)...);
|
||||
FOR_NUMERIC_TYPES_AND_ENUMS(DISPATCH)
|
||||
WhichDataType which(argument_type);
|
||||
#define DISPATCH(TYPE) \
|
||||
if (which.idx == TypeIndex::TYPE) return new AggregateFunctionTemplate<TYPE>(std::forward<TArgs>(args)...);
|
||||
FOR_NUMERIC_TYPES(DISPATCH)
|
||||
#undef DISPATCH
|
||||
if (which.idx == TypeIndex::Enum8) return new AggregateFunctionTemplate<UInt8>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Enum16) return new AggregateFunctionTemplate<UInt16>(std::forward<TArgs>(args)...);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
template <template <typename, typename> class AggregateFunctionTemplate, typename Data, typename ... TArgs>
|
||||
static IAggregateFunction * createWithNumericType(const IDataType & argument_type, TArgs && ... args)
|
||||
{
|
||||
#define DISPATCH(FIELDTYPE, DATATYPE) \
|
||||
if (typeid_cast<const DATATYPE *>(&argument_type)) return new AggregateFunctionTemplate<FIELDTYPE, Data>(std::forward<TArgs>(args)...);
|
||||
FOR_NUMERIC_TYPES_AND_ENUMS(DISPATCH)
|
||||
WhichDataType which(argument_type);
|
||||
#define DISPATCH(TYPE) \
|
||||
if (which.idx == TypeIndex::TYPE) return new AggregateFunctionTemplate<TYPE, Data>(std::forward<TArgs>(args)...);
|
||||
FOR_NUMERIC_TYPES(DISPATCH)
|
||||
#undef DISPATCH
|
||||
if (which.idx == TypeIndex::Enum8) return new AggregateFunctionTemplate<UInt8, Data>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Enum16) return new AggregateFunctionTemplate<UInt16, Data>(std::forward<TArgs>(args)...);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
template <template <typename, typename> class AggregateFunctionTemplate, template <typename> class Data, typename ... TArgs>
|
||||
static IAggregateFunction * createWithNumericType(const IDataType & argument_type, TArgs && ... args)
|
||||
{
|
||||
#define DISPATCH(FIELDTYPE, DATATYPE) \
|
||||
if (typeid_cast<const DATATYPE *>(&argument_type)) return new AggregateFunctionTemplate<FIELDTYPE, Data<FIELDTYPE>>(std::forward<TArgs>(args)...);
|
||||
FOR_NUMERIC_TYPES_AND_ENUMS(DISPATCH)
|
||||
WhichDataType which(argument_type);
|
||||
#define DISPATCH(TYPE) \
|
||||
if (which.idx == TypeIndex::TYPE) return new AggregateFunctionTemplate<TYPE, Data<TYPE>>(std::forward<TArgs>(args)...);
|
||||
FOR_NUMERIC_TYPES(DISPATCH)
|
||||
#undef DISPATCH
|
||||
if (which.idx == TypeIndex::Enum8) return new AggregateFunctionTemplate<UInt8, Data<UInt8>>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Enum16) return new AggregateFunctionTemplate<UInt16, Data<UInt16>>(std::forward<TArgs>(args)...);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@ -77,10 +63,11 @@ static IAggregateFunction * createWithNumericType(const IDataType & argument_typ
|
||||
template <template <typename, typename> class AggregateFunctionTemplate, template <typename> class Data, typename ... TArgs>
|
||||
static IAggregateFunction * createWithUnsignedIntegerType(const IDataType & argument_type, TArgs && ... args)
|
||||
{
|
||||
#define DISPATCH(TYPE) \
|
||||
if (typeid_cast<const DataType ## TYPE *>(&argument_type)) return new AggregateFunctionTemplate<TYPE, Data<TYPE>>(std::forward<TArgs>(args)...);
|
||||
FOR_UNSIGNED_INTEGER_TYPES(DISPATCH)
|
||||
#undef DISPATCH
|
||||
WhichDataType which(argument_type);
|
||||
if (which.idx == TypeIndex::UInt8) return new AggregateFunctionTemplate<UInt8, Data<UInt8>>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::UInt16) return new AggregateFunctionTemplate<UInt16, Data<UInt16>>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::UInt32) return new AggregateFunctionTemplate<UInt32, Data<UInt32>>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::UInt64) return new AggregateFunctionTemplate<UInt64, Data<UInt64>>(std::forward<TArgs>(args)...);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@ -90,21 +77,29 @@ static IAggregateFunction * createWithUnsignedIntegerType(const IDataType & argu
|
||||
template <typename FirstType, template <typename, typename> class AggregateFunctionTemplate, typename ... TArgs>
|
||||
static IAggregateFunction * createWithTwoNumericTypesSecond(const IDataType & second_type, TArgs && ... args)
|
||||
{
|
||||
#define DISPATCH(FIELDTYPE, DATATYPE) \
|
||||
if (typeid_cast<const DATATYPE *>(&second_type)) return new AggregateFunctionTemplate<FirstType, FIELDTYPE>(std::forward<TArgs>(args)...);
|
||||
FOR_NUMERIC_TYPES_AND_ENUMS(DISPATCH)
|
||||
WhichDataType which(second_type);
|
||||
#define DISPATCH(TYPE) \
|
||||
if (which.idx == TypeIndex::TYPE) return new AggregateFunctionTemplate<FirstType, TYPE>(std::forward<TArgs>(args)...);
|
||||
FOR_NUMERIC_TYPES(DISPATCH)
|
||||
#undef DISPATCH
|
||||
if (which.idx == TypeIndex::Enum8) return new AggregateFunctionTemplate<FirstType, UInt8>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Enum16) return new AggregateFunctionTemplate<FirstType, UInt16>(std::forward<TArgs>(args)...);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
template <template <typename, typename> class AggregateFunctionTemplate, typename ... TArgs>
|
||||
static IAggregateFunction * createWithTwoNumericTypes(const IDataType & first_type, const IDataType & second_type, TArgs && ... args)
|
||||
{
|
||||
#define DISPATCH(FIELDTYPE, DATATYPE) \
|
||||
if (typeid_cast<const DATATYPE *>(&first_type)) \
|
||||
return createWithTwoNumericTypesSecond<FIELDTYPE, AggregateFunctionTemplate>(second_type, std::forward<TArgs>(args)...);
|
||||
FOR_NUMERIC_TYPES_AND_ENUMS(DISPATCH)
|
||||
WhichDataType which(first_type);
|
||||
#define DISPATCH(TYPE) \
|
||||
if (which.idx == TypeIndex::TYPE) \
|
||||
return createWithTwoNumericTypesSecond<TYPE, AggregateFunctionTemplate>(second_type, std::forward<TArgs>(args)...);
|
||||
FOR_NUMERIC_TYPES(DISPATCH)
|
||||
#undef DISPATCH
|
||||
if (which.idx == TypeIndex::Enum8)
|
||||
return createWithTwoNumericTypesSecond<UInt8, AggregateFunctionTemplate>(second_type, std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Enum16)
|
||||
return createWithTwoNumericTypesSecond<UInt16, AggregateFunctionTemplate>(second_type, std::forward<TArgs>(args)...);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
@ -4,11 +4,10 @@
|
||||
#include <AggregateFunctions/AggregateFunctionArgMinMax.h>
|
||||
#include <AggregateFunctions/FactoryHelpers.h>
|
||||
#include <AggregateFunctions/Helpers.h>
|
||||
#include <Common/typeid_cast.h>
|
||||
|
||||
#include <DataTypes/DataTypeDate.h>
|
||||
#include <DataTypes/DataTypeDateTime.h>
|
||||
#include <DataTypes/DataTypeString.h>
|
||||
#include <DataTypes/DataTypesNumber.h>
|
||||
|
||||
|
||||
namespace DB
|
||||
@ -23,16 +22,17 @@ static IAggregateFunction * createAggregateFunctionSingleValue(const String & na
|
||||
|
||||
const DataTypePtr & argument_type = argument_types[0];
|
||||
|
||||
WhichDataType which(argument_type);
|
||||
#define DISPATCH(TYPE) \
|
||||
if (typeid_cast<const DataType ## TYPE *>(argument_type.get())) return new AggregateFunctionTemplate<Data<SingleValueDataFixed<TYPE>>>(argument_type);
|
||||
if (which.idx == TypeIndex::TYPE) return new AggregateFunctionTemplate<Data<SingleValueDataFixed<TYPE>>>(argument_type);
|
||||
FOR_NUMERIC_TYPES(DISPATCH)
|
||||
#undef DISPATCH
|
||||
|
||||
if (typeid_cast<const DataTypeDate *>(argument_type.get()))
|
||||
if (which.idx == TypeIndex::Date)
|
||||
return new AggregateFunctionTemplate<Data<SingleValueDataFixed<DataTypeDate::FieldType>>>(argument_type);
|
||||
if (typeid_cast<const DataTypeDateTime *>(argument_type.get()))
|
||||
if (which.idx == TypeIndex::DateTime)
|
||||
return new AggregateFunctionTemplate<Data<SingleValueDataFixed<DataTypeDateTime::FieldType>>>(argument_type);
|
||||
if (typeid_cast<const DataTypeString *>(argument_type.get()))
|
||||
if (which.idx == TypeIndex::String)
|
||||
return new AggregateFunctionTemplate<Data<SingleValueDataString>>(argument_type);
|
||||
|
||||
return new AggregateFunctionTemplate<Data<SingleValueDataGeneric>>(argument_type);
|
||||
@ -43,17 +43,18 @@ static IAggregateFunction * createAggregateFunctionSingleValue(const String & na
|
||||
template <template <typename> class MinMaxData, typename ResData>
|
||||
static IAggregateFunction * createAggregateFunctionArgMinMaxSecond(const DataTypePtr & res_type, const DataTypePtr & val_type)
|
||||
{
|
||||
WhichDataType which(val_type);
|
||||
#define DISPATCH(TYPE) \
|
||||
if (typeid_cast<const DataType ## TYPE *>(val_type.get())) \
|
||||
if (which.idx == TypeIndex::TYPE) \
|
||||
return new AggregateFunctionArgMinMax<AggregateFunctionArgMinMaxData<ResData, MinMaxData<SingleValueDataFixed<TYPE>>>>(res_type, val_type);
|
||||
FOR_NUMERIC_TYPES(DISPATCH)
|
||||
#undef DISPATCH
|
||||
|
||||
if (typeid_cast<const DataTypeDate *>(val_type.get()))
|
||||
if (which.idx == TypeIndex::Date)
|
||||
return new AggregateFunctionArgMinMax<AggregateFunctionArgMinMaxData<ResData, MinMaxData<SingleValueDataFixed<DataTypeDate::FieldType>>>>(res_type, val_type);
|
||||
if (typeid_cast<const DataTypeDateTime*>(val_type.get()))
|
||||
if (which.idx == TypeIndex::DateTime)
|
||||
return new AggregateFunctionArgMinMax<AggregateFunctionArgMinMaxData<ResData, MinMaxData<SingleValueDataFixed<DataTypeDateTime::FieldType>>>>(res_type, val_type);
|
||||
if (typeid_cast<const DataTypeString*>(val_type.get()))
|
||||
if (which.idx == TypeIndex::String)
|
||||
return new AggregateFunctionArgMinMax<AggregateFunctionArgMinMaxData<ResData, MinMaxData<SingleValueDataString>>>(res_type, val_type);
|
||||
|
||||
return new AggregateFunctionArgMinMax<AggregateFunctionArgMinMaxData<ResData, MinMaxData<SingleValueDataGeneric>>>(res_type, val_type);
|
||||
@ -68,17 +69,18 @@ static IAggregateFunction * createAggregateFunctionArgMinMax(const String & name
|
||||
const DataTypePtr & res_type = argument_types[0];
|
||||
const DataTypePtr & val_type = argument_types[1];
|
||||
|
||||
WhichDataType which(res_type);
|
||||
#define DISPATCH(TYPE) \
|
||||
if (typeid_cast<const DataType ## TYPE *>(res_type.get())) \
|
||||
if (which.idx == TypeIndex::TYPE) \
|
||||
return createAggregateFunctionArgMinMaxSecond<MinMaxData, SingleValueDataFixed<TYPE>>(res_type, val_type);
|
||||
FOR_NUMERIC_TYPES(DISPATCH)
|
||||
#undef DISPATCH
|
||||
|
||||
if (typeid_cast<const DataTypeDate *>(res_type.get()))
|
||||
if (which.idx == TypeIndex::Date)
|
||||
return createAggregateFunctionArgMinMaxSecond<MinMaxData, SingleValueDataFixed<DataTypeDate::FieldType>>(res_type, val_type);
|
||||
if (typeid_cast<const DataTypeDateTime*>(res_type.get()))
|
||||
if (which.idx == TypeIndex::DateTime)
|
||||
return createAggregateFunctionArgMinMaxSecond<MinMaxData, SingleValueDataFixed<DataTypeDateTime::FieldType>>(res_type, val_type);
|
||||
if (typeid_cast<const DataTypeString*>(res_type.get()))
|
||||
if (which.idx == TypeIndex::String)
|
||||
return createAggregateFunctionArgMinMaxSecond<MinMaxData, SingleValueDataString>(res_type, val_type);
|
||||
|
||||
return createAggregateFunctionArgMinMaxSecond<MinMaxData, SingleValueDataGeneric>(res_type, val_type);
|
||||
|
@ -100,15 +100,18 @@ void ColumnGathererStream::readSuffixImpl()
|
||||
return;
|
||||
|
||||
double seconds = profile_info.total_stopwatch.elapsedSeconds();
|
||||
std::stringstream speed;
|
||||
if (seconds)
|
||||
speed << ", " << profile_info.rows / seconds << " rows/sec., "
|
||||
<< profile_info.bytes / 1048576.0 / seconds << " MiB/sec.";
|
||||
LOG_TRACE(log, std::fixed << std::setprecision(2)
|
||||
|
||||
std::stringstream message;
|
||||
message << std::fixed << std::setprecision(2)
|
||||
<< "Gathered column " << column_name
|
||||
<< " (" << static_cast<double>(profile_info.bytes) / profile_info.rows << " bytes/elem.)"
|
||||
<< " in " << seconds << " sec."
|
||||
<< speed.str());
|
||||
<< " in " << seconds << " sec.";
|
||||
|
||||
if (seconds)
|
||||
message << ", " << profile_info.rows / seconds << " rows/sec., "
|
||||
<< profile_info.bytes / 1048576.0 / seconds << " MiB/sec.";
|
||||
|
||||
LOG_TRACE(log, message.str());
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -480,6 +480,12 @@ inline bool isDecimal(const DataTypePtr & data_type) { return WhichDataType(data
|
||||
inline bool isTuple(const DataTypePtr & data_type) { return WhichDataType(data_type).isTuple(); }
|
||||
inline bool isArray(const DataTypePtr & data_type) { return WhichDataType(data_type).isArray(); }
|
||||
|
||||
template <typename T>
|
||||
inline bool isUInt8(const T & data_type)
|
||||
{
|
||||
return WhichDataType(data_type).isUInt8();
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline bool isUnsignedInteger(const T & data_type)
|
||||
{
|
||||
|
@ -409,6 +409,7 @@ MergeTreeRangeReader::ReadResult MergeTreeRangeReader::read(size_t max_rows, Mar
|
||||
|
||||
ReadResult read_result;
|
||||
size_t prev_bytes = 0;
|
||||
bool should_reorder = false;
|
||||
|
||||
if (prev_reader)
|
||||
{
|
||||
@ -416,7 +417,6 @@ MergeTreeRangeReader::ReadResult MergeTreeRangeReader::read(size_t max_rows, Mar
|
||||
prev_bytes = read_result.block.bytes();
|
||||
Block block = continueReadingChain(read_result);
|
||||
|
||||
bool should_reorder = false;
|
||||
bool should_evaluate_missing_defaults = false;
|
||||
if (block)
|
||||
{
|
||||
@ -436,9 +436,6 @@ MergeTreeRangeReader::ReadResult MergeTreeRangeReader::read(size_t max_rows, Mar
|
||||
{
|
||||
if (should_evaluate_missing_defaults)
|
||||
merge_tree_reader->evaluateMissingDefaults(read_result.block);
|
||||
|
||||
if (should_reorder || always_reorder || block.columns())
|
||||
merge_tree_reader->reorderColumns(read_result.block, *ordered_names, prewhere_column_name);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -446,15 +443,11 @@ MergeTreeRangeReader::ReadResult MergeTreeRangeReader::read(size_t max_rows, Mar
|
||||
read_result = startReadingChain(max_rows, ranges);
|
||||
if (read_result.block)
|
||||
{
|
||||
bool should_reorder;
|
||||
bool should_evaluate_missing_defaults;
|
||||
merge_tree_reader->fillMissingColumns(read_result.block, should_reorder, should_evaluate_missing_defaults);
|
||||
|
||||
if (should_evaluate_missing_defaults)
|
||||
merge_tree_reader->evaluateMissingDefaults(read_result.block);
|
||||
|
||||
if (should_reorder || always_reorder)
|
||||
merge_tree_reader->reorderColumns(read_result.block, *ordered_names, prewhere_column_name);
|
||||
}
|
||||
}
|
||||
|
||||
@ -464,6 +457,10 @@ MergeTreeRangeReader::ReadResult MergeTreeRangeReader::read(size_t max_rows, Mar
|
||||
read_result.addNumBytesRead(read_result.block.bytes() - prev_bytes);
|
||||
|
||||
executePrewhereActionsAndFilterColumns(read_result);
|
||||
|
||||
if (last_reader_in_chain && (should_reorder || always_reorder))
|
||||
merge_tree_reader->reorderColumns(read_result.block, *ordered_names, prewhere_column_name);
|
||||
|
||||
return read_result;
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,5 @@
|
||||
1 Hello, world!
|
||||
1 Hello, world! 0
|
||||
2 Goodbye. 3
|
||||
Goodbye.
|
||||
Goodbye. 3
|
@ -0,0 +1,14 @@
|
||||
DROP TABLE IF EXISTS test.mergetree;
|
||||
CREATE TABLE test.mergetree (x UInt8, s String) ENGINE = MergeTree ORDER BY tuple();
|
||||
|
||||
INSERT INTO test.mergetree VALUES (1, 'Hello, world!');
|
||||
SELECT * FROM test.mergetree;
|
||||
|
||||
ALTER TABLE test.mergetree ADD COLUMN y UInt8 DEFAULT 0;
|
||||
INSERT INTO test.mergetree VALUES (2, 'Goodbye.', 3);
|
||||
SELECT * FROM test.mergetree ORDER BY x;
|
||||
|
||||
SELECT s FROM test.mergetree PREWHERE x AND y ORDER BY s;
|
||||
SELECT s, y FROM test.mergetree PREWHERE x AND y ORDER BY s;
|
||||
|
||||
DROP TABLE test.mergetree;
|
4
debian/changelog
vendored
4
debian/changelog
vendored
@ -1,5 +1,5 @@
|
||||
clickhouse (18.12.11) unstable; urgency=low
|
||||
clickhouse (18.12.13) unstable; urgency=low
|
||||
|
||||
* Modified source code
|
||||
|
||||
-- <root@yandex-team.ru> Mon, 10 Sep 2018 13:44:17 +0300
|
||||
-- <root@yandex-team.ru> Mon, 10 Sep 2018 22:07:26 +0300
|
||||
|
@ -1,7 +1,7 @@
|
||||
FROM ubuntu:18.04
|
||||
|
||||
ARG repository="deb http://repo.yandex.ru/clickhouse/deb/stable/ main/"
|
||||
ARG version=18.12.11
|
||||
ARG version=18.12.13
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install -y apt-transport-https dirmngr && \
|
||||
|
@ -1,7 +1,7 @@
|
||||
FROM ubuntu:18.04
|
||||
|
||||
ARG repository="deb http://repo.yandex.ru/clickhouse/deb/stable/ main/"
|
||||
ARG version=18.12.11
|
||||
ARG version=18.12.13
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install -y apt-transport-https dirmngr && \
|
||||
|
@ -1,7 +1,7 @@
|
||||
FROM ubuntu:18.04
|
||||
|
||||
ARG repository="deb http://repo.yandex.ru/clickhouse/deb/stable/ main/"
|
||||
ARG version=18.12.11
|
||||
ARG version=18.12.13
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install -y apt-transport-https dirmngr && \
|
||||
|
Loading…
Reference in New Issue
Block a user