mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-22 15:42:02 +00:00
dbms: Server: sync with master. [#METR-15210]
This commit is contained in:
commit
80ef06d511
@ -211,13 +211,13 @@ namespace DB
|
|||||||
if (i < size)
|
if (i < size)
|
||||||
{
|
{
|
||||||
Data tmp{0};
|
Data tmp{0};
|
||||||
for (size_t j = 0; (j < data_size) && (i + j) < size; ++j)
|
for (size_t j = 0; (j < data_size) && ((i + j) < size); ++j)
|
||||||
tmp[j] = in[i + j];
|
tmp[j] = in[i + j];
|
||||||
|
|
||||||
Data res;
|
Data res;
|
||||||
Op::compute(tmp, mm_scale, res);
|
Op::compute(tmp, mm_scale, res);
|
||||||
|
|
||||||
for (size_t j = 0; (j < data_size) && (i + j) < size; ++j)
|
for (size_t j = 0; (j < data_size) && ((i + j) < size); ++j)
|
||||||
out[i + j] = in[i + j];
|
out[i + j] = in[i + j];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -288,7 +288,7 @@ namespace
|
|||||||
{
|
{
|
||||||
/// Отдельные степени числа 10.
|
/// Отдельные степени числа 10.
|
||||||
|
|
||||||
template <size_t N>
|
template<size_t N>
|
||||||
struct PowerOf10
|
struct PowerOf10
|
||||||
{
|
{
|
||||||
static const size_t value = 10 * PowerOf10<N - 1>::value;
|
static const size_t value = 10 * PowerOf10<N - 1>::value;
|
||||||
@ -303,33 +303,33 @@ namespace
|
|||||||
|
|
||||||
/// Объявление и определение контейнера содержащего таблицу степеней числа 10.
|
/// Объявление и определение контейнера содержащего таблицу степеней числа 10.
|
||||||
|
|
||||||
template <size_t... TArgs>
|
template<size_t... TArgs>
|
||||||
struct TableContainer
|
struct TableContainer
|
||||||
{
|
{
|
||||||
static const std::array<size_t, sizeof...(TArgs)> values;
|
static const std::array<size_t, sizeof...(TArgs)> values;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <size_t... TArgs>
|
template<size_t... TArgs>
|
||||||
const std::array<size_t, sizeof...(TArgs)> TableContainer<TArgs...>::values = { TArgs... };
|
const std::array<size_t, sizeof...(TArgs)> TableContainer<TArgs...>::values = { TArgs... };
|
||||||
|
|
||||||
/// Генератор первых N степеней.
|
/// Генератор первых N степеней.
|
||||||
|
|
||||||
template <size_t N, size_t... TArgs>
|
template<size_t N, size_t... TArgs>
|
||||||
struct FillArrayImpl
|
struct FillArrayImpl
|
||||||
{
|
{
|
||||||
using result = typename FillArrayImpl<N - 1, PowerOf10<N>::value, TArgs...>::result;
|
using result = typename FillArrayImpl<N - 1, PowerOf10<N>::value, TArgs...>::result;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <size_t... TArgs>
|
template<size_t... TArgs>
|
||||||
struct FillArrayImpl<0, TArgs...>
|
struct FillArrayImpl<0, TArgs...>
|
||||||
{
|
{
|
||||||
using result = TableContainer<PowerOf10<0>::value, TArgs...>;
|
using result = TableContainer<PowerOf10<0>::value, TArgs...>;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <size_t N>
|
template<size_t N>
|
||||||
struct FillArray
|
struct FillArray
|
||||||
{
|
{
|
||||||
using result = typename FillArrayImpl<N-1>::result;
|
using result = typename FillArrayImpl<N - 1>::result;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Шаблон для функций, которые вычисляют приближенное значение входного параметра
|
/** Шаблон для функций, которые вычисляют приближенное значение входного параметра
|
||||||
@ -357,6 +357,8 @@ namespace
|
|||||||
template<typename T>
|
template<typename T>
|
||||||
bool executeForType(Block & block, const ColumnNumbers & arguments, size_t result)
|
bool executeForType(Block & block, const ColumnNumbers & arguments, size_t result)
|
||||||
{
|
{
|
||||||
|
using Op = FunctionRoundingImpl<T, rounding_mode>;
|
||||||
|
|
||||||
if (ColumnVector<T> * col = typeid_cast<ColumnVector<T> *>(&*block.getByPosition(arguments[0]).column))
|
if (ColumnVector<T> * col = typeid_cast<ColumnVector<T> *>(&*block.getByPosition(arguments[0]).column))
|
||||||
{
|
{
|
||||||
UInt8 precision = 0;
|
UInt8 precision = 0;
|
||||||
@ -369,7 +371,7 @@ namespace
|
|||||||
typename ColumnVector<T>::Container_t & vec_res = col_res->getData();
|
typename ColumnVector<T>::Container_t & vec_res = col_res->getData();
|
||||||
vec_res.resize(col->getData().size());
|
vec_res.resize(col->getData().size());
|
||||||
|
|
||||||
FunctionRoundingImpl<T, rounding_mode>::apply(col->getData(), PowersOf10::values[precision], vec_res);
|
Op::apply(col->getData(), PowersOf10::values[precision], vec_res);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -379,7 +381,7 @@ namespace
|
|||||||
if (arguments.size() == 2)
|
if (arguments.size() == 2)
|
||||||
precision = getPrecision<T>(block.getByPosition(arguments[1]).column);
|
precision = getPrecision<T>(block.getByPosition(arguments[1]).column);
|
||||||
|
|
||||||
T res = FunctionRoundingImpl<T, rounding_mode>::apply(col->getData(), PowersOf10::values[precision]);
|
T res = Op::apply(col->getData(), PowersOf10::values[precision]);
|
||||||
|
|
||||||
ColumnConst<T> * col_res = new ColumnConst<T>(col->size(), res);
|
ColumnConst<T> * col_res = new ColumnConst<T>(col->size(), res);
|
||||||
block.getByPosition(result).column = col_res;
|
block.getByPosition(result).column = col_res;
|
||||||
|
Loading…
Reference in New Issue
Block a user