mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-25 09:02:00 +00:00
Support for NULLs in function if: continued [#CLICKHOUSE-2873].
This commit is contained in:
parent
169fc988b7
commit
f9a5902e76
@ -1,14 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <string.h> // memcpy
|
|
||||||
|
|
||||||
#include <DB/Common/Exception.h>
|
|
||||||
#include <DB/Common/Arena.h>
|
|
||||||
#include <DB/Common/SipHash.h>
|
|
||||||
|
|
||||||
#include <DB/Columns/IColumn.h>
|
#include <DB/Columns/IColumn.h>
|
||||||
#include <DB/Columns/ColumnsNumber.h>
|
#include <DB/Columns/ColumnVector.h>
|
||||||
#include <DB/Columns/ColumnString.h>
|
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
@ -32,261 +25,35 @@ public:
|
|||||||
using ColumnOffsets_t = ColumnVector<Offset_t>;
|
using ColumnOffsets_t = ColumnVector<Offset_t>;
|
||||||
|
|
||||||
/** Создать пустой столбец массивов, с типом значений, как в столбце nested_column */
|
/** Создать пустой столбец массивов, с типом значений, как в столбце nested_column */
|
||||||
explicit ColumnArray(ColumnPtr nested_column, ColumnPtr offsets_column = nullptr)
|
explicit ColumnArray(ColumnPtr nested_column, ColumnPtr offsets_column = nullptr);
|
||||||
: data(nested_column), offsets(offsets_column)
|
|
||||||
{
|
|
||||||
if (!offsets_column)
|
|
||||||
{
|
|
||||||
offsets = std::make_shared<ColumnOffsets_t>();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!typeid_cast<ColumnOffsets_t *>(&*offsets_column))
|
|
||||||
throw Exception("offsets_column must be a ColumnUInt64", ErrorCodes::ILLEGAL_COLUMN);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nested_column->isConst())
|
|
||||||
throw Exception{"ColumnArray cannot have constant nested column", ErrorCodes::LOGICAL_ERROR};
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string getName() const override { return "ColumnArray(" + getData().getName() + ")"; }
|
|
||||||
|
|
||||||
ColumnPtr cloneResized(size_t size) const override
|
|
||||||
{
|
|
||||||
ColumnPtr new_col_holder = std::make_shared<ColumnArray>(getData().cloneEmpty());
|
|
||||||
|
|
||||||
if (size > 0)
|
|
||||||
{
|
|
||||||
auto & new_col = static_cast<ColumnArray &>(*new_col_holder);
|
|
||||||
size_t count = std::min(this->size(), size);
|
|
||||||
|
|
||||||
/// First create the offsets.
|
|
||||||
const auto & from_offsets = getOffsets();
|
|
||||||
auto & new_offsets = new_col.getOffsets();
|
|
||||||
new_offsets.resize(size);
|
|
||||||
new_offsets.assign(from_offsets.begin(), from_offsets.begin() + count);
|
|
||||||
|
|
||||||
if (size > count)
|
|
||||||
{
|
|
||||||
for (size_t i = count; i < size; ++i)
|
|
||||||
new_offsets[i] = new_offsets[i - 1];
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Then store the data.
|
|
||||||
new_col.getData().insertRangeFrom(getData(), 0, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new_col_holder;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t size() const override
|
|
||||||
{
|
|
||||||
return getOffsets().size();
|
|
||||||
}
|
|
||||||
|
|
||||||
Field operator[](size_t n) const override
|
|
||||||
{
|
|
||||||
size_t offset = offsetAt(n);
|
|
||||||
size_t size = sizeAt(n);
|
|
||||||
Array res(size);
|
|
||||||
|
|
||||||
for (size_t i = 0; i < size; ++i)
|
|
||||||
res[i] = getData()[offset + i];
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
void get(size_t n, Field & res) const override
|
|
||||||
{
|
|
||||||
size_t offset = offsetAt(n);
|
|
||||||
size_t size = sizeAt(n);
|
|
||||||
res = Array(size);
|
|
||||||
Array & res_arr = DB::get<Array &>(res);
|
|
||||||
|
|
||||||
for (size_t i = 0; i < size; ++i)
|
|
||||||
getData().get(offset + i, res_arr[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
StringRef getDataAt(size_t n) const override
|
|
||||||
{
|
|
||||||
/** Возвращает диапазон памяти, покрывающий все элементы массива.
|
|
||||||
* Работает для массивов значений фиксированной длины.
|
|
||||||
* Для массивов строк и массивов массивов полученный кусок памяти может не взаимно-однозначно соответствовать элементам,
|
|
||||||
* так как содержит лишь уложенные подряд данные, но не смещения.
|
|
||||||
*/
|
|
||||||
|
|
||||||
size_t array_size = sizeAt(n);
|
|
||||||
if (array_size == 0)
|
|
||||||
return StringRef();
|
|
||||||
|
|
||||||
size_t offset_of_first_elem = offsetAt(n);
|
|
||||||
StringRef first = getData().getDataAtWithTerminatingZero(offset_of_first_elem);
|
|
||||||
|
|
||||||
size_t offset_of_last_elem = getOffsets()[n] - 1;
|
|
||||||
StringRef last = getData().getDataAtWithTerminatingZero(offset_of_last_elem);
|
|
||||||
|
|
||||||
return StringRef(first.data, last.data + last.size - first.data);
|
|
||||||
}
|
|
||||||
|
|
||||||
void insertData(const char * pos, size_t length) override
|
|
||||||
{
|
|
||||||
/** Аналогично - только для массивов значений фиксированной длины.
|
|
||||||
*/
|
|
||||||
IColumn * data_ = data.get();
|
|
||||||
if (!data_->isFixed())
|
|
||||||
throw Exception("Method insertData is not supported for " + getName(), ErrorCodes::NOT_IMPLEMENTED);
|
|
||||||
|
|
||||||
size_t field_size = data_->sizeOfField();
|
|
||||||
|
|
||||||
const char * end = pos + length;
|
|
||||||
size_t elems = 0;
|
|
||||||
for (; pos + field_size <= end; pos += field_size, ++elems)
|
|
||||||
data_->insertData(pos, field_size);
|
|
||||||
|
|
||||||
if (pos != end)
|
|
||||||
throw Exception("Incorrect length argument for method ColumnArray::insertData", ErrorCodes::BAD_ARGUMENTS);
|
|
||||||
|
|
||||||
getOffsets().push_back((getOffsets().size() == 0 ? 0 : getOffsets().back()) + elems);
|
|
||||||
}
|
|
||||||
|
|
||||||
StringRef serializeValueIntoArena(size_t n, Arena & arena, char const *& begin) const override
|
|
||||||
{
|
|
||||||
size_t array_size = sizeAt(n);
|
|
||||||
size_t offset = offsetAt(n);
|
|
||||||
|
|
||||||
char * pos = arena.allocContinue(sizeof(array_size), begin);
|
|
||||||
memcpy(pos, &array_size, sizeof(array_size));
|
|
||||||
|
|
||||||
size_t values_size = 0;
|
|
||||||
for (size_t i = 0; i < array_size; ++i)
|
|
||||||
values_size += getData().serializeValueIntoArena(offset + i, arena, begin).size;
|
|
||||||
|
|
||||||
return StringRef(begin, sizeof(array_size) + values_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char * deserializeAndInsertFromArena(const char * pos) override
|
|
||||||
{
|
|
||||||
size_t array_size = *reinterpret_cast<const size_t *>(pos);
|
|
||||||
pos += sizeof(array_size);
|
|
||||||
|
|
||||||
for (size_t i = 0; i < array_size; ++i)
|
|
||||||
pos = getData().deserializeAndInsertFromArena(pos);
|
|
||||||
|
|
||||||
getOffsets().push_back((getOffsets().size() == 0 ? 0 : getOffsets().back()) + array_size);
|
|
||||||
return pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
void updateHashWithValue(size_t n, SipHash & hash) const override
|
|
||||||
{
|
|
||||||
size_t array_size = sizeAt(n);
|
|
||||||
size_t offset = offsetAt(n);
|
|
||||||
|
|
||||||
hash.update(reinterpret_cast<const char *>(&array_size), sizeof(array_size));
|
|
||||||
for (size_t i = 0; i < array_size; ++i)
|
|
||||||
getData().updateHashWithValue(offset + i, hash);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
std::string getName() const override;
|
||||||
|
ColumnPtr cloneResized(size_t size) const override;
|
||||||
|
size_t size() const override;
|
||||||
|
Field operator[](size_t n) const override;
|
||||||
|
void get(size_t n, Field & res) const override;
|
||||||
|
StringRef getDataAt(size_t n) const override;
|
||||||
|
void insertData(const char * pos, size_t length) override;
|
||||||
|
StringRef serializeValueIntoArena(size_t n, Arena & arena, char const *& begin) const override;
|
||||||
|
const char * deserializeAndInsertFromArena(const char * pos) override;
|
||||||
|
void updateHashWithValue(size_t n, SipHash & hash) const override;
|
||||||
void insertRangeFrom(const IColumn & src, size_t start, size_t length) override;
|
void insertRangeFrom(const IColumn & src, size_t start, size_t length) override;
|
||||||
|
void insert(const Field & x) override;
|
||||||
void insert(const Field & x) override
|
void insertFrom(const IColumn & src_, size_t n) override;
|
||||||
{
|
void insertDefault() override;
|
||||||
const Array & array = DB::get<const Array &>(x);
|
void popBack(size_t n) override;
|
||||||
size_t size = array.size();
|
|
||||||
for (size_t i = 0; i < size; ++i)
|
|
||||||
getData().insert(array[i]);
|
|
||||||
getOffsets().push_back((getOffsets().size() == 0 ? 0 : getOffsets().back()) + size);
|
|
||||||
}
|
|
||||||
|
|
||||||
void insertFrom(const IColumn & src_, size_t n) override
|
|
||||||
{
|
|
||||||
const ColumnArray & src = static_cast<const ColumnArray &>(src_);
|
|
||||||
size_t size = src.sizeAt(n);
|
|
||||||
size_t offset = src.offsetAt(n);
|
|
||||||
|
|
||||||
getData().insertRangeFrom(src.getData(), offset, size);
|
|
||||||
getOffsets().push_back((getOffsets().size() == 0 ? 0 : getOffsets().back()) + size);
|
|
||||||
}
|
|
||||||
|
|
||||||
void insertDefault() override
|
|
||||||
{
|
|
||||||
getOffsets().push_back(getOffsets().size() == 0 ? 0 : getOffsets().back());
|
|
||||||
}
|
|
||||||
|
|
||||||
void popBack(size_t n) override
|
|
||||||
{
|
|
||||||
auto & offsets = getOffsets();
|
|
||||||
size_t nested_n = offsets.back() - offsetAt(offsets.size() - n);
|
|
||||||
if (nested_n)
|
|
||||||
getData().popBack(nested_n);
|
|
||||||
offsets.resize_assume_reserved(offsets.size() - n);
|
|
||||||
}
|
|
||||||
|
|
||||||
ColumnPtr filter(const Filter & filt, ssize_t result_size_hint) const override;
|
ColumnPtr filter(const Filter & filt, ssize_t result_size_hint) const override;
|
||||||
|
|
||||||
ColumnPtr permute(const Permutation & perm, size_t limit) const override;
|
ColumnPtr permute(const Permutation & perm, size_t limit) const override;
|
||||||
|
int compareAt(size_t n, size_t m, const IColumn & rhs_, int nan_direction_hint) const override;
|
||||||
int compareAt(size_t n, size_t m, const IColumn & rhs_, int nan_direction_hint) const override
|
|
||||||
{
|
|
||||||
const ColumnArray & rhs = static_cast<const ColumnArray &>(rhs_);
|
|
||||||
|
|
||||||
/// Не оптимально
|
|
||||||
size_t lhs_size = sizeAt(n);
|
|
||||||
size_t rhs_size = rhs.sizeAt(m);
|
|
||||||
size_t min_size = std::min(lhs_size, rhs_size);
|
|
||||||
for (size_t i = 0; i < min_size; ++i)
|
|
||||||
if (int res = getData().compareAt(offsetAt(n) + i, rhs.offsetAt(m) + i, *rhs.data.get(), nan_direction_hint))
|
|
||||||
return res;
|
|
||||||
|
|
||||||
return lhs_size < rhs_size
|
|
||||||
? -1
|
|
||||||
: (lhs_size == rhs_size
|
|
||||||
? 0
|
|
||||||
: 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <bool positive>
|
|
||||||
struct less
|
|
||||||
{
|
|
||||||
const ColumnArray & parent;
|
|
||||||
|
|
||||||
less(const ColumnArray & parent_) : parent(parent_) {}
|
|
||||||
|
|
||||||
bool operator()(size_t lhs, size_t rhs) const
|
|
||||||
{
|
|
||||||
if (positive)
|
|
||||||
return parent.compareAt(lhs, rhs, parent, 1) < 0;
|
|
||||||
else
|
|
||||||
return parent.compareAt(lhs, rhs, parent, -1) > 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
void getPermutation(bool reverse, size_t limit, Permutation & res) const override;
|
void getPermutation(bool reverse, size_t limit, Permutation & res) const override;
|
||||||
|
void reserve(size_t n) override;
|
||||||
|
size_t byteSize() const override;
|
||||||
|
size_t allocatedSize() const override;
|
||||||
|
ColumnPtr replicate(const Offsets_t & replicate_offsets) const override;
|
||||||
|
ColumnPtr convertToFullColumnIfConst() const override;
|
||||||
|
void getExtremes(Field & min, Field & max) const override;
|
||||||
|
|
||||||
void reserve(size_t n) override
|
bool hasEqualOffsets(const ColumnArray & other) const;
|
||||||
{
|
|
||||||
getOffsets().reserve(n);
|
|
||||||
getData().reserve(n); /// Средний размер массивов тут никак не учитывается. Или считается, что он не больше единицы.
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t byteSize() const override
|
|
||||||
{
|
|
||||||
return getData().byteSize() + getOffsets().size() * sizeof(getOffsets()[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t allocatedSize() const override
|
|
||||||
{
|
|
||||||
return getData().allocatedSize() + getOffsets().allocated_size() * sizeof(getOffsets()[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool hasEqualOffsets(const ColumnArray & other) const
|
|
||||||
{
|
|
||||||
if (offsets == other.offsets)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
const Offsets_t & offsets1 = getOffsets();
|
|
||||||
const Offsets_t & offsets2 = other.getOffsets();
|
|
||||||
return offsets1.size() == offsets2.size() && 0 == memcmp(&offsets1[0], &offsets2[0], sizeof(offsets1[0]) * offsets1.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Более эффективные методы манипуляции */
|
/** Более эффективные методы манипуляции */
|
||||||
IColumn & getData() { return *data.get(); }
|
IColumn & getData() { return *data.get(); }
|
||||||
@ -308,38 +75,11 @@ public:
|
|||||||
ColumnPtr & getOffsetsColumn() { return offsets; }
|
ColumnPtr & getOffsetsColumn() { return offsets; }
|
||||||
const ColumnPtr & getOffsetsColumn() const { return offsets; }
|
const ColumnPtr & getOffsetsColumn() const { return offsets; }
|
||||||
|
|
||||||
|
|
||||||
ColumnPtr replicate(const Offsets_t & replicate_offsets) const override;
|
|
||||||
|
|
||||||
Columns scatter(ColumnIndex num_columns, const Selector & selector) const override
|
Columns scatter(ColumnIndex num_columns, const Selector & selector) const override
|
||||||
{
|
{
|
||||||
return scatterImpl<ColumnArray>(num_columns, selector);
|
return scatterImpl<ColumnArray>(num_columns, selector);
|
||||||
}
|
}
|
||||||
|
|
||||||
ColumnPtr convertToFullColumnIfConst() const override
|
|
||||||
{
|
|
||||||
ColumnPtr new_data;
|
|
||||||
ColumnPtr new_offsets;
|
|
||||||
|
|
||||||
if (auto full_column = getData().convertToFullColumnIfConst())
|
|
||||||
new_data = full_column;
|
|
||||||
else
|
|
||||||
new_data = data;
|
|
||||||
|
|
||||||
if (auto full_column = offsets.get()->convertToFullColumnIfConst())
|
|
||||||
new_offsets = full_column;
|
|
||||||
else
|
|
||||||
new_offsets = offsets;
|
|
||||||
|
|
||||||
return std::make_shared<ColumnArray>(new_data, new_offsets);
|
|
||||||
}
|
|
||||||
|
|
||||||
void getExtremes(Field & min, Field & max) const override
|
|
||||||
{
|
|
||||||
min = Array();
|
|
||||||
max = Array();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ColumnPtr data;
|
ColumnPtr data;
|
||||||
ColumnPtr offsets; /// Смещения могут быть разделяемыми для нескольких столбцов - для реализации вложенных структур данных.
|
ColumnPtr offsets; /// Смещения могут быть разделяемыми для нескольких столбцов - для реализации вложенных структур данных.
|
||||||
|
@ -2,10 +2,7 @@
|
|||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <DB/Core/Defines.h>
|
|
||||||
|
|
||||||
#include <DB/Columns/IColumn.h>
|
#include <DB/Columns/IColumn.h>
|
||||||
#include <DB/Columns/ColumnsCommon.h>
|
|
||||||
#include <DB/Common/PODArray.h>
|
#include <DB/Common/PODArray.h>
|
||||||
#include <DB/Common/Arena.h>
|
#include <DB/Common/Arena.h>
|
||||||
#include <DB/Common/SipHash.h>
|
#include <DB/Common/SipHash.h>
|
||||||
@ -18,14 +15,7 @@ class Collator;
|
|||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
|
|
||||||
namespace ErrorCodes
|
/** Column for String values.
|
||||||
{
|
|
||||||
extern const int PARAMETER_OUT_OF_BOUND;
|
|
||||||
extern const int SIZES_OF_COLUMNS_DOESNT_MATCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** Cтолбeц значений типа "строка".
|
|
||||||
*/
|
*/
|
||||||
class ColumnString final : public IColumn
|
class ColumnString final : public IColumn
|
||||||
{
|
{
|
||||||
@ -33,24 +23,25 @@ public:
|
|||||||
using Chars_t = PaddedPODArray<UInt8>;
|
using Chars_t = PaddedPODArray<UInt8>;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// По индексу i находится смещение до начала i + 1 -го элемента.
|
/// Maps i'th position to offset to i+1'th element. Last offset maps to the end of all chars (is the size of all chars).
|
||||||
Offsets_t offsets;
|
Offsets_t offsets;
|
||||||
|
|
||||||
/// Байты строк, уложенные подряд. Строки хранятся с завершающим нулевым байтом.
|
/// Bytes of strings, placed contiguously.
|
||||||
|
/// For convenience, every string ends with terminating zero byte. Note that strings could contain zero bytes in the middle.
|
||||||
Chars_t chars;
|
Chars_t chars;
|
||||||
|
|
||||||
size_t __attribute__((__always_inline__)) offsetAt(size_t i) const { return i == 0 ? 0 : offsets[i - 1]; }
|
size_t __attribute__((__always_inline__)) offsetAt(size_t i) const { return i == 0 ? 0 : offsets[i - 1]; }
|
||||||
|
|
||||||
/// Размер, включая завершающий нулевой байт.
|
/// Size of i-th element, including terminating zero.
|
||||||
size_t __attribute__((__always_inline__)) sizeAt(size_t i) const { return i == 0 ? offsets[0] : (offsets[i] - offsets[i - 1]); }
|
size_t __attribute__((__always_inline__)) sizeAt(size_t i) const { return i == 0 ? offsets[0] : (offsets[i] - offsets[i - 1]); }
|
||||||
|
|
||||||
template <bool positive>
|
template <bool positive>
|
||||||
friend struct lessWithCollation;
|
struct less;
|
||||||
|
|
||||||
|
template <bool positive>
|
||||||
|
struct lessWithCollation;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/** Создать пустой столбец строк */
|
|
||||||
ColumnString() {}
|
|
||||||
|
|
||||||
std::string getName() const override { return "ColumnString"; }
|
std::string getName() const override { return "ColumnString"; }
|
||||||
|
|
||||||
size_t size() const override
|
size_t size() const override
|
||||||
@ -68,48 +59,7 @@ public:
|
|||||||
return chars.allocated_size() + offsets.allocated_size() * sizeof(offsets[0]);
|
return chars.allocated_size() + offsets.allocated_size() * sizeof(offsets[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
ColumnPtr cloneResized(size_t to_size) const override
|
ColumnPtr cloneResized(size_t to_size) const override;
|
||||||
{
|
|
||||||
auto res = std::make_shared<ColumnString>();
|
|
||||||
|
|
||||||
if (to_size == 0)
|
|
||||||
return res;
|
|
||||||
|
|
||||||
size_t from_size = size();
|
|
||||||
|
|
||||||
if (to_size <= from_size)
|
|
||||||
{
|
|
||||||
/// Just cut column.
|
|
||||||
|
|
||||||
res->offsets.assign(offsets.begin(), offsets.begin() + to_size);
|
|
||||||
res->chars.assign(chars.begin(), chars.begin() + offsets[to_size - 1]);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/// Copy column and append empty strings for extra elements.
|
|
||||||
|
|
||||||
Offset_t offset = 0;
|
|
||||||
if (from_size > 0)
|
|
||||||
{
|
|
||||||
res->offsets.assign(offsets.begin(), offsets.end());
|
|
||||||
res->chars.assign(chars.begin(), chars.end());
|
|
||||||
offset = offsets.back();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Empty strings are just zero terminating bytes.
|
|
||||||
|
|
||||||
res->chars.resize_fill(res->chars.size() + to_size - from_size);
|
|
||||||
|
|
||||||
res->offsets.resize(to_size);
|
|
||||||
for (size_t i = from_size; i < to_size; ++i)
|
|
||||||
{
|
|
||||||
++offset;
|
|
||||||
res->offsets[i] = offset;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
Field operator[](size_t n) const override
|
Field operator[](size_t n) const override
|
||||||
{
|
{
|
||||||
@ -246,101 +196,11 @@ public:
|
|||||||
hash.update(reinterpret_cast<const char *>(&chars[offset]), string_size);
|
hash.update(reinterpret_cast<const char *>(&chars[offset]), string_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void insertRangeFrom(const IColumn & src, size_t start, size_t length) override
|
void insertRangeFrom(const IColumn & src, size_t start, size_t length) override;
|
||||||
{
|
|
||||||
if (length == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
const ColumnString & src_concrete = static_cast<const ColumnString &>(src);
|
ColumnPtr filter(const Filter & filt, ssize_t result_size_hint) const override;
|
||||||
|
|
||||||
if (start + length > src_concrete.offsets.size())
|
ColumnPtr permute(const Permutation & perm, size_t limit) const override;
|
||||||
throw Exception("Parameter out of bound in IColumnString::insertRangeFrom method.",
|
|
||||||
ErrorCodes::PARAMETER_OUT_OF_BOUND);
|
|
||||||
|
|
||||||
size_t nested_offset = src_concrete.offsetAt(start);
|
|
||||||
size_t nested_length = src_concrete.offsets[start + length - 1] - nested_offset;
|
|
||||||
|
|
||||||
size_t old_chars_size = chars.size();
|
|
||||||
chars.resize(old_chars_size + nested_length);
|
|
||||||
memcpy(&chars[old_chars_size], &src_concrete.chars[nested_offset], nested_length);
|
|
||||||
|
|
||||||
if (start == 0 && offsets.empty())
|
|
||||||
{
|
|
||||||
offsets.assign(src_concrete.offsets.begin(), src_concrete.offsets.begin() + length);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
size_t old_size = offsets.size();
|
|
||||||
size_t prev_max_offset = old_size ? offsets.back() : 0;
|
|
||||||
offsets.resize(old_size + length);
|
|
||||||
|
|
||||||
for (size_t i = 0; i < length; ++i)
|
|
||||||
offsets[old_size + i] = src_concrete.offsets[start + i] - nested_offset + prev_max_offset;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ColumnPtr filter(const Filter & filt, ssize_t result_size_hint) const override
|
|
||||||
{
|
|
||||||
if (offsets.size() == 0)
|
|
||||||
return std::make_shared<ColumnString>();
|
|
||||||
|
|
||||||
auto res = std::make_shared<ColumnString>();
|
|
||||||
|
|
||||||
Chars_t & res_chars = res->chars;
|
|
||||||
Offsets_t & res_offsets = res->offsets;
|
|
||||||
|
|
||||||
filterArraysImpl<UInt8>(chars, offsets, res_chars, res_offsets, filt, result_size_hint);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
ColumnPtr permute(const Permutation & perm, size_t limit) const override
|
|
||||||
{
|
|
||||||
size_t size = offsets.size();
|
|
||||||
|
|
||||||
if (limit == 0)
|
|
||||||
limit = size;
|
|
||||||
else
|
|
||||||
limit = std::min(size, limit);
|
|
||||||
|
|
||||||
if (perm.size() < limit)
|
|
||||||
throw Exception("Size of permutation is less than required.", ErrorCodes::SIZES_OF_COLUMNS_DOESNT_MATCH);
|
|
||||||
|
|
||||||
if (limit == 0)
|
|
||||||
return std::make_shared<ColumnString>();
|
|
||||||
|
|
||||||
std::shared_ptr<ColumnString> res = std::make_shared<ColumnString>();
|
|
||||||
|
|
||||||
Chars_t & res_chars = res->chars;
|
|
||||||
Offsets_t & res_offsets = res->offsets;
|
|
||||||
|
|
||||||
if (limit == size)
|
|
||||||
res_chars.resize(chars.size());
|
|
||||||
else
|
|
||||||
{
|
|
||||||
size_t new_chars_size = 0;
|
|
||||||
for (size_t i = 0; i < limit; ++i)
|
|
||||||
new_chars_size += sizeAt(perm[i]);
|
|
||||||
res_chars.resize(new_chars_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
res_offsets.resize(limit);
|
|
||||||
|
|
||||||
Offset_t current_new_offset = 0;
|
|
||||||
|
|
||||||
for (size_t i = 0; i < limit; ++i)
|
|
||||||
{
|
|
||||||
size_t j = perm[i];
|
|
||||||
size_t string_offset = j == 0 ? 0 : offsets[j - 1];
|
|
||||||
size_t string_size = offsets[j] - string_offset;
|
|
||||||
|
|
||||||
memcpySmallAllowReadWriteOverflow15(&res_chars[current_new_offset], &chars[string_offset], string_size);
|
|
||||||
|
|
||||||
current_new_offset += string_size;
|
|
||||||
res_offsets[i] = current_new_offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
void insertDefault() override
|
void insertDefault() override
|
||||||
{
|
{
|
||||||
@ -361,117 +221,30 @@ public:
|
|||||||
reinterpret_cast<const char *>(&rhs.chars[rhs.offsetAt(m)]));
|
reinterpret_cast<const char *>(&rhs.chars[rhs.offsetAt(m)]));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Версия compareAt для locale-sensitive сравнения строк
|
/// Variant of compareAt for string comparison with respect of collation.
|
||||||
int compareAtWithCollation(size_t n, size_t m, const IColumn & rhs_, const Collator & collator) const;
|
int compareAtWithCollation(size_t n, size_t m, const IColumn & rhs_, const Collator & collator) const;
|
||||||
|
|
||||||
template <bool positive>
|
void getPermutation(bool reverse, size_t limit, Permutation & res) const override;
|
||||||
struct less
|
|
||||||
{
|
|
||||||
const ColumnString & parent;
|
|
||||||
less(const ColumnString & parent_) : parent(parent_) {}
|
|
||||||
bool operator()(size_t lhs, size_t rhs) const
|
|
||||||
{
|
|
||||||
int res = strcmp(
|
|
||||||
reinterpret_cast<const char *>(&parent.chars[parent.offsetAt(lhs)]),
|
|
||||||
reinterpret_cast<const char *>(&parent.chars[parent.offsetAt(rhs)]));
|
|
||||||
|
|
||||||
return positive ? (res < 0) : (res > 0);
|
/// Sorting with respect of collation.
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
void getPermutation(bool reverse, size_t limit, Permutation & res) const override
|
|
||||||
{
|
|
||||||
size_t s = offsets.size();
|
|
||||||
res.resize(s);
|
|
||||||
for (size_t i = 0; i < s; ++i)
|
|
||||||
res[i] = i;
|
|
||||||
|
|
||||||
if (limit >= s)
|
|
||||||
limit = 0;
|
|
||||||
|
|
||||||
if (limit)
|
|
||||||
{
|
|
||||||
if (reverse)
|
|
||||||
std::partial_sort(res.begin(), res.begin() + limit, res.end(), less<false>(*this));
|
|
||||||
else
|
|
||||||
std::partial_sort(res.begin(), res.begin() + limit, res.end(), less<true>(*this));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (reverse)
|
|
||||||
std::sort(res.begin(), res.end(), less<false>(*this));
|
|
||||||
else
|
|
||||||
std::sort(res.begin(), res.end(), less<true>(*this));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Сортировка с учетом Collation
|
|
||||||
void getPermutationWithCollation(const Collator & collator, bool reverse, size_t limit, Permutation & res) const;
|
void getPermutationWithCollation(const Collator & collator, bool reverse, size_t limit, Permutation & res) const;
|
||||||
|
|
||||||
ColumnPtr replicate(const Offsets_t & replicate_offsets) const override
|
ColumnPtr replicate(const Offsets_t & replicate_offsets) const override;
|
||||||
{
|
|
||||||
size_t col_size = size();
|
|
||||||
if (col_size != replicate_offsets.size())
|
|
||||||
throw Exception("Size of offsets doesn't match size of column.", ErrorCodes::SIZES_OF_COLUMNS_DOESNT_MATCH);
|
|
||||||
|
|
||||||
std::shared_ptr<ColumnString> res = std::make_shared<ColumnString>();
|
|
||||||
|
|
||||||
if (0 == col_size)
|
|
||||||
return res;
|
|
||||||
|
|
||||||
Chars_t & res_chars = res->chars;
|
|
||||||
Offsets_t & res_offsets = res->offsets;
|
|
||||||
res_chars.reserve(chars.size() / col_size * replicate_offsets.back());
|
|
||||||
res_offsets.reserve(replicate_offsets.back());
|
|
||||||
|
|
||||||
Offset_t prev_replicate_offset = 0;
|
|
||||||
Offset_t prev_string_offset = 0;
|
|
||||||
Offset_t current_new_offset = 0;
|
|
||||||
|
|
||||||
for (size_t i = 0; i < col_size; ++i)
|
|
||||||
{
|
|
||||||
size_t size_to_replicate = replicate_offsets[i] - prev_replicate_offset;
|
|
||||||
size_t string_size = offsets[i] - prev_string_offset;
|
|
||||||
|
|
||||||
for (size_t j = 0; j < size_to_replicate; ++j)
|
|
||||||
{
|
|
||||||
current_new_offset += string_size;
|
|
||||||
res_offsets.push_back(current_new_offset);
|
|
||||||
|
|
||||||
res_chars.resize(res_chars.size() + string_size);
|
|
||||||
memcpySmallAllowReadWriteOverflow15(
|
|
||||||
&res_chars[res_chars.size() - string_size], &chars[prev_string_offset], string_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
prev_replicate_offset = replicate_offsets[i];
|
|
||||||
prev_string_offset = offsets[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
Columns scatter(ColumnIndex num_columns, const Selector & selector) const override
|
Columns scatter(ColumnIndex num_columns, const Selector & selector) const override
|
||||||
{
|
{
|
||||||
return scatterImpl<ColumnString>(num_columns, selector);
|
return scatterImpl<ColumnString>(num_columns, selector);
|
||||||
}
|
}
|
||||||
|
|
||||||
void reserve(size_t n) override
|
void reserve(size_t n) override;
|
||||||
{
|
|
||||||
offsets.reserve(n);
|
void getExtremes(Field & min, Field & max) const override;
|
||||||
chars.reserve(n * DBMS_APPROX_STRING_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
Chars_t & getChars() { return chars; }
|
Chars_t & getChars() { return chars; }
|
||||||
const Chars_t & getChars() const { return chars; }
|
const Chars_t & getChars() const { return chars; }
|
||||||
|
|
||||||
Offsets_t & getOffsets() { return offsets; }
|
Offsets_t & getOffsets() { return offsets; }
|
||||||
const Offsets_t & getOffsets() const { return offsets; }
|
const Offsets_t & getOffsets() const { return offsets; }
|
||||||
|
|
||||||
void getExtremes(Field & min, Field & max) const override
|
|
||||||
{
|
|
||||||
min = String();
|
|
||||||
max = String();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -7,8 +7,10 @@
|
|||||||
#include <DB/DataTypes/DataTypeArray.h>
|
#include <DB/DataTypes/DataTypeArray.h>
|
||||||
#include <DB/Columns/ColumnVector.h>
|
#include <DB/Columns/ColumnVector.h>
|
||||||
#include <DB/Columns/ColumnArray.h>
|
#include <DB/Columns/ColumnArray.h>
|
||||||
|
#include <DB/Common/memcpySmall.h>
|
||||||
#include <DB/Functions/NumberTraits.h>
|
#include <DB/Functions/NumberTraits.h>
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -699,7 +699,6 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -707,7 +706,6 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 2; }
|
size_t getNumberOfArguments() const override { return 2; }
|
||||||
|
|
||||||
/// Получить типы результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
DataTypePtr type_res;
|
DataTypePtr type_res;
|
||||||
@ -730,7 +728,6 @@ public:
|
|||||||
return type_res;
|
return type_res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
if (!( executeLeftType<DataTypeDate>(block, arguments, result)
|
if (!( executeLeftType<DataTypeDate>(block, arguments, result)
|
||||||
@ -809,7 +806,6 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -818,7 +814,6 @@ public:
|
|||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
bool isInjective(const Block &) override { return is_injective; }
|
bool isInjective(const Block &) override { return is_injective; }
|
||||||
|
|
||||||
/// Получить типы результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
DataTypePtr result;
|
DataTypePtr result;
|
||||||
@ -839,7 +834,6 @@ public:
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
if (!( executeType<UInt8>(block, arguments, result)
|
if (!( executeType<UInt8>(block, arguments, result)
|
||||||
|
@ -73,14 +73,11 @@ public:
|
|||||||
bool isVariadic() const override { return true; }
|
bool isVariadic() const override { return true; }
|
||||||
size_t getNumberOfArguments() const override { return 0; }
|
size_t getNumberOfArguments() const override { return 0; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override;
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override;
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override;
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override;
|
String getName() const override;
|
||||||
|
|
||||||
bool addField(DataTypePtr type_res, const Field & f, Array & arr) const;
|
bool addField(DataTypePtr type_res, const Field & f, Array & arr) const;
|
||||||
@ -102,15 +99,12 @@ public:
|
|||||||
static constexpr auto name = "arrayElement";
|
static constexpr auto name = "arrayElement";
|
||||||
static FunctionPtr create(const Context & context);
|
static FunctionPtr create(const Context & context);
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override;
|
String getName() const override;
|
||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 2; }
|
size_t getNumberOfArguments() const override { return 2; }
|
||||||
|
|
||||||
/// Получить типы результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override;
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override;
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override;
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -1178,15 +1172,12 @@ public:
|
|||||||
static constexpr auto name = "arrayEnumerate";
|
static constexpr auto name = "arrayEnumerate";
|
||||||
static FunctionPtr create(const Context & context);
|
static FunctionPtr create(const Context & context);
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override;
|
String getName() const override;
|
||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
|
|
||||||
/// Получить типы результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override;
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override;
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override;
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1199,16 +1190,13 @@ public:
|
|||||||
static constexpr auto name = "arrayUniq";
|
static constexpr auto name = "arrayUniq";
|
||||||
static FunctionPtr create(const Context & context);
|
static FunctionPtr create(const Context & context);
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override;
|
String getName() const override;
|
||||||
|
|
||||||
bool isVariadic() const override { return true; }
|
bool isVariadic() const override { return true; }
|
||||||
size_t getNumberOfArguments() const override { return 0; }
|
size_t getNumberOfArguments() const override { return 0; }
|
||||||
|
|
||||||
/// Получить типы результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override;
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override;
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override;
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -1242,16 +1230,13 @@ public:
|
|||||||
static constexpr auto name = "arrayEnumerateUniq";
|
static constexpr auto name = "arrayEnumerateUniq";
|
||||||
static FunctionPtr create(const Context & context);
|
static FunctionPtr create(const Context & context);
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override;
|
String getName() const override;
|
||||||
|
|
||||||
bool isVariadic() const override { return true; }
|
bool isVariadic() const override { return true; }
|
||||||
size_t getNumberOfArguments() const override { return 0; }
|
size_t getNumberOfArguments() const override { return 0; }
|
||||||
|
|
||||||
/// Получить типы результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override;
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override;
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override;
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -1346,15 +1331,12 @@ public:
|
|||||||
static constexpr auto name = "emptyArrayToSingle";
|
static constexpr auto name = "emptyArrayToSingle";
|
||||||
static FunctionPtr create(const Context & context);
|
static FunctionPtr create(const Context & context);
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override;
|
String getName() const override;
|
||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
|
|
||||||
/// Получить типы результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override;
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override;
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override;
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -1387,15 +1369,12 @@ public:
|
|||||||
static constexpr auto name = "reverse";
|
static constexpr auto name = "reverse";
|
||||||
static FunctionPtr create(const Context & context);
|
static FunctionPtr create(const Context & context);
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override;
|
String getName() const override;
|
||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
|
|
||||||
/// Получить типы результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override;
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override;
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override;
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -1434,7 +1413,6 @@ public:
|
|||||||
static constexpr auto name = "arrayReduce";
|
static constexpr auto name = "arrayReduce";
|
||||||
static FunctionPtr create(const Context & context);
|
static FunctionPtr create(const Context & context);
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override;
|
String getName() const override;
|
||||||
|
|
||||||
bool isVariadic() const override { return true; }
|
bool isVariadic() const override { return true; }
|
||||||
|
@ -640,7 +640,6 @@ public:
|
|||||||
static constexpr auto name = "IPv4NumToString";
|
static constexpr auto name = "IPv4NumToString";
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionIPv4NumToString>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionIPv4NumToString>(); }
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -649,7 +648,6 @@ public:
|
|||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
bool isInjective(const Block &) override { return true; }
|
bool isInjective(const Block &) override { return true; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (!typeid_cast<const DataTypeUInt32 *>(&*arguments[0]))
|
if (!typeid_cast<const DataTypeUInt32 *>(&*arguments[0]))
|
||||||
@ -693,7 +691,6 @@ public:
|
|||||||
*(out++) = '\0';
|
*(out++) = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
const ColumnPtr & column = block.safeGetByPosition(arguments[0]).column;
|
const ColumnPtr & column = block.safeGetByPosition(arguments[0]).column;
|
||||||
@ -744,7 +741,6 @@ public:
|
|||||||
static constexpr auto name = "IPv4StringToNum";
|
static constexpr auto name = "IPv4StringToNum";
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionIPv4StringToNum>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionIPv4StringToNum>(); }
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -752,7 +748,6 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (!typeid_cast<const DataTypeString *>(&*arguments[0]))
|
if (!typeid_cast<const DataTypeString *>(&*arguments[0]))
|
||||||
@ -785,7 +780,6 @@ public:
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
const ColumnPtr & column = block.safeGetByPosition(arguments[0]).column;
|
const ColumnPtr & column = block.safeGetByPosition(arguments[0]).column;
|
||||||
@ -827,7 +821,6 @@ public:
|
|||||||
static constexpr auto name = "IPv4NumToStringClassC";
|
static constexpr auto name = "IPv4NumToStringClassC";
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionIPv4NumToStringClassC>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionIPv4NumToStringClassC>(); }
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -835,7 +828,6 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (!typeid_cast<const DataTypeUInt32 *>(&*arguments[0]))
|
if (!typeid_cast<const DataTypeUInt32 *>(&*arguments[0]))
|
||||||
@ -882,7 +874,6 @@ public:
|
|||||||
*(out++) = '\0';
|
*(out++) = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
const ColumnPtr & column = block.safeGetByPosition(arguments[0]).column;
|
const ColumnPtr & column = block.safeGetByPosition(arguments[0]).column;
|
||||||
@ -1272,7 +1263,6 @@ public:
|
|||||||
static constexpr auto name = "hex";
|
static constexpr auto name = "hex";
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionHex>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionHex>(); }
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -1281,7 +1271,6 @@ public:
|
|||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
bool isInjective(const Block &) override { return true; }
|
bool isInjective(const Block &) override { return true; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (!typeid_cast<const DataTypeString *>(&*arguments[0]) &&
|
if (!typeid_cast<const DataTypeString *>(&*arguments[0]) &&
|
||||||
@ -1491,7 +1480,6 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
const IColumn * column = block.safeGetByPosition(arguments[0]).column.get();
|
const IColumn * column = block.safeGetByPosition(arguments[0]).column.get();
|
||||||
@ -1518,7 +1506,6 @@ public:
|
|||||||
static constexpr auto name = "unhex";
|
static constexpr auto name = "unhex";
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionUnhex>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionUnhex>(); }
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -1527,7 +1514,6 @@ public:
|
|||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
bool isInjective(const Block &) override { return true; }
|
bool isInjective(const Block &) override { return true; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (!typeid_cast<const DataTypeString *>(&*arguments[0]))
|
if (!typeid_cast<const DataTypeString *>(&*arguments[0]))
|
||||||
@ -1561,7 +1547,6 @@ public:
|
|||||||
*(out++) = '\0';
|
*(out++) = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
const ColumnPtr & column = block.safeGetByPosition(arguments[0]).column;
|
const ColumnPtr & column = block.safeGetByPosition(arguments[0]).column;
|
||||||
@ -1624,7 +1609,6 @@ public:
|
|||||||
static constexpr auto name = "bitmaskToArray";
|
static constexpr auto name = "bitmaskToArray";
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionBitmaskToArray>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionBitmaskToArray>(); }
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -1633,7 +1617,6 @@ public:
|
|||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
bool isInjective(const Block &) override { return true; }
|
bool isInjective(const Block &) override { return true; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (!typeid_cast<const DataTypeUInt8 *>(&*arguments[0]) &&
|
if (!typeid_cast<const DataTypeUInt8 *>(&*arguments[0]) &&
|
||||||
@ -1707,7 +1690,6 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
const IColumn * in_column = block.safeGetByPosition(arguments[0]).column.get();
|
const IColumn * in_column = block.safeGetByPosition(arguments[0]).column.get();
|
||||||
@ -1735,7 +1717,6 @@ public:
|
|||||||
static constexpr auto name = "toStringCutToZero";
|
static constexpr auto name = "toStringCutToZero";
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionToStringCutToZero>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionToStringCutToZero>(); }
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -1743,7 +1724,6 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (!typeid_cast<const DataTypeFixedString *>(&*arguments[0]) &&
|
if (!typeid_cast<const DataTypeFixedString *>(&*arguments[0]) &&
|
||||||
@ -1854,7 +1834,6 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
const IColumn * column = block.safeGetByPosition(arguments[0]).column.get();
|
const IColumn * column = block.safeGetByPosition(arguments[0]).column.get();
|
||||||
|
@ -776,7 +776,6 @@ private:
|
|||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -853,7 +852,6 @@ public:
|
|||||||
return std::make_shared<DataTypeUInt8>();
|
return std::make_shared<DataTypeUInt8>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
const auto & col_with_type_and_name_left = block.safeGetByPosition(arguments[0]);
|
const auto & col_with_type_and_name_left = block.safeGetByPosition(arguments[0]);
|
||||||
|
@ -1573,7 +1573,6 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
|
@ -670,7 +670,6 @@ public:
|
|||||||
size_t getNumberOfArguments() const override { return 0; }
|
size_t getNumberOfArguments() const override { return 0; }
|
||||||
bool isInjective(const Block &) override { return std::is_same<Name, NameToString>::value; }
|
bool isInjective(const Block &) override { return std::is_same<Name, NameToString>::value; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
return getReturnTypeInternal(arguments);
|
return getReturnTypeInternal(arguments);
|
||||||
@ -891,7 +890,6 @@ public:
|
|||||||
static constexpr auto name = "toFixedString";
|
static constexpr auto name = "toFixedString";
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionToFixedString>(); };
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionToFixedString>(); };
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -919,7 +917,6 @@ public:
|
|||||||
out_return_type = std::make_shared<DataTypeFixedString>(n);
|
out_return_type = std::make_shared<DataTypeFixedString>(n);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, const size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, const size_t result) override
|
||||||
{
|
{
|
||||||
const auto n = getSize(block.safeGetByPosition(arguments[1]));
|
const auto n = getSize(block.safeGetByPosition(arguments[1]));
|
||||||
|
@ -484,7 +484,6 @@ public:
|
|||||||
static constexpr auto name = Name::name;
|
static constexpr auto name = Name::name;
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionDateOrDateTimeToSomething>(); };
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionDateOrDateTimeToSomething>(); };
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -493,7 +492,6 @@ public:
|
|||||||
bool isVariadic() const override { return true; }
|
bool isVariadic() const override { return true; }
|
||||||
size_t getNumberOfArguments() const override { return 0; }
|
size_t getNumberOfArguments() const override { return 0; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (arguments.size() == 1)
|
if (arguments.size() == 1)
|
||||||
@ -523,7 +521,6 @@ public:
|
|||||||
return std::make_shared<ToDataType>();
|
return std::make_shared<ToDataType>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
IDataType * from_type = block.safeGetByPosition(arguments[0]).type.get();
|
IDataType * from_type = block.safeGetByPosition(arguments[0]).type.get();
|
||||||
@ -582,7 +579,6 @@ public:
|
|||||||
static constexpr auto name = "now";
|
static constexpr auto name = "now";
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionNow>(); };
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionNow>(); };
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -590,13 +586,11 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 0; }
|
size_t getNumberOfArguments() const override { return 0; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
return std::make_shared<DataTypeDateTime>();
|
return std::make_shared<DataTypeDateTime>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
block.safeGetByPosition(result).column = std::make_shared<ColumnConstUInt32>(
|
block.safeGetByPosition(result).column = std::make_shared<ColumnConstUInt32>(
|
||||||
@ -612,7 +606,6 @@ public:
|
|||||||
static constexpr auto name = "today";
|
static constexpr auto name = "today";
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionToday>(); };
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionToday>(); };
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -620,13 +613,11 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 0; }
|
size_t getNumberOfArguments() const override { return 0; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
return std::make_shared<DataTypeDate>();
|
return std::make_shared<DataTypeDate>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
block.safeGetByPosition(result).column = std::make_shared<ColumnConstUInt16>(
|
block.safeGetByPosition(result).column = std::make_shared<ColumnConstUInt16>(
|
||||||
@ -642,7 +633,6 @@ public:
|
|||||||
static constexpr auto name = "yesterday";
|
static constexpr auto name = "yesterday";
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionYesterday>(); };
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionYesterday>(); };
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -650,13 +640,11 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 0; }
|
size_t getNumberOfArguments() const override { return 0; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
return std::make_shared<DataTypeDate>();
|
return std::make_shared<DataTypeDate>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
block.safeGetByPosition(result).column = std::make_shared<ColumnConstUInt16>(
|
block.safeGetByPosition(result).column = std::make_shared<ColumnConstUInt16>(
|
||||||
@ -672,7 +660,6 @@ public:
|
|||||||
static constexpr auto name = "timeSlot";
|
static constexpr auto name = "timeSlot";
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionTimeSlot>(); };
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionTimeSlot>(); };
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -680,7 +667,6 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (!typeid_cast<const DataTypeDateTime *>(arguments[0].get()))
|
if (!typeid_cast<const DataTypeDateTime *>(arguments[0].get()))
|
||||||
@ -690,7 +676,6 @@ public:
|
|||||||
return std::make_shared<DataTypeDateTime>();
|
return std::make_shared<DataTypeDateTime>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
if (const ColumnUInt32 * times = typeid_cast<const ColumnUInt32 *>(block.safeGetByPosition(arguments[0]).column.get()))
|
if (const ColumnUInt32 * times = typeid_cast<const ColumnUInt32 *>(block.safeGetByPosition(arguments[0]).column.get()))
|
||||||
@ -805,7 +790,6 @@ public:
|
|||||||
static constexpr auto name = "timeSlots";
|
static constexpr auto name = "timeSlots";
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionTimeSlots>(); };
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionTimeSlots>(); };
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -813,7 +797,6 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 2; }
|
size_t getNumberOfArguments() const override { return 2; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (!typeid_cast<const DataTypeDateTime *>(arguments[0].get()))
|
if (!typeid_cast<const DataTypeDateTime *>(arguments[0].get()))
|
||||||
@ -827,7 +810,6 @@ public:
|
|||||||
return std::make_shared<DataTypeArray>(std::make_shared<DataTypeDateTime>());
|
return std::make_shared<DataTypeArray>(std::make_shared<DataTypeDateTime>());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
const ColumnUInt32 * starts = typeid_cast<const ColumnUInt32 *>(block.safeGetByPosition(arguments[0]).column.get());
|
const ColumnUInt32 * starts = typeid_cast<const ColumnUInt32 *>(block.safeGetByPosition(arguments[0]).column.get());
|
||||||
|
@ -201,7 +201,6 @@ public:
|
|||||||
throw Exception("Dictionaries was not loaded. You need to check configuration file.", ErrorCodes::DICTIONARIES_WAS_NOT_LOADED);
|
throw Exception("Dictionaries was not loaded. You need to check configuration file.", ErrorCodes::DICTIONARIES_WAS_NOT_LOADED);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -210,7 +209,6 @@ public:
|
|||||||
bool isVariadic() const override { return true; }
|
bool isVariadic() const override { return true; }
|
||||||
size_t getNumberOfArguments() const override { return 0; }
|
size_t getNumberOfArguments() const override { return 0; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (arguments.size() != 1 && arguments.size() != 2)
|
if (arguments.size() != 1 && arguments.size() != 2)
|
||||||
@ -231,7 +229,6 @@ public:
|
|||||||
return arguments[0];
|
return arguments[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
/// Ключ словаря, определяющий "точку зрения".
|
/// Ключ словаря, определяющий "точку зрения".
|
||||||
@ -297,7 +294,6 @@ public:
|
|||||||
throw Exception("Dictionaries was not loaded. You need to check configuration file.", ErrorCodes::DICTIONARIES_WAS_NOT_LOADED);
|
throw Exception("Dictionaries was not loaded. You need to check configuration file.", ErrorCodes::DICTIONARIES_WAS_NOT_LOADED);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -306,7 +302,6 @@ public:
|
|||||||
bool isVariadic() const override { return true; }
|
bool isVariadic() const override { return true; }
|
||||||
size_t getNumberOfArguments() const override { return 0; }
|
size_t getNumberOfArguments() const override { return 0; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (arguments.size() != 2 && arguments.size() != 3)
|
if (arguments.size() != 2 && arguments.size() != 3)
|
||||||
@ -332,7 +327,6 @@ public:
|
|||||||
return std::make_shared<DataTypeUInt8>();
|
return std::make_shared<DataTypeUInt8>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
/// Ключ словаря, определяющий "точку зрения".
|
/// Ключ словаря, определяющий "точку зрения".
|
||||||
@ -433,7 +427,6 @@ public:
|
|||||||
throw Exception("Dictionaries was not loaded. You need to check configuration file.", ErrorCodes::DICTIONARIES_WAS_NOT_LOADED);
|
throw Exception("Dictionaries was not loaded. You need to check configuration file.", ErrorCodes::DICTIONARIES_WAS_NOT_LOADED);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -442,7 +435,6 @@ public:
|
|||||||
bool isVariadic() const override { return true; }
|
bool isVariadic() const override { return true; }
|
||||||
size_t getNumberOfArguments() const override { return 0; }
|
size_t getNumberOfArguments() const override { return 0; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (arguments.size() != 1 && arguments.size() != 2)
|
if (arguments.size() != 1 && arguments.size() != 2)
|
||||||
@ -463,7 +455,6 @@ public:
|
|||||||
return std::make_shared<DataTypeArray>(arguments[0]);
|
return std::make_shared<DataTypeArray>(arguments[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
/// Ключ словаря, определяющий "точку зрения".
|
/// Ключ словаря, определяющий "точку зрения".
|
||||||
@ -709,7 +700,6 @@ public:
|
|||||||
throw Exception("Dictionaries was not loaded. You need to check configuration file.", ErrorCodes::DICTIONARIES_WAS_NOT_LOADED);
|
throw Exception("Dictionaries was not loaded. You need to check configuration file.", ErrorCodes::DICTIONARIES_WAS_NOT_LOADED);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -722,7 +712,6 @@ public:
|
|||||||
/// even in face of fact that there are many different cities named Moscow.
|
/// even in face of fact that there are many different cities named Moscow.
|
||||||
bool isInjective(const Block &) override { return true; }
|
bool isInjective(const Block &) override { return true; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (arguments.size() != 1 && arguments.size() != 2)
|
if (arguments.size() != 1 && arguments.size() != 2)
|
||||||
@ -743,7 +732,6 @@ public:
|
|||||||
return std::make_shared<DataTypeString>();
|
return std::make_shared<DataTypeString>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
RegionsNames::Language language = RegionsNames::Language::RU;
|
RegionsNames::Language language = RegionsNames::Language::RU;
|
||||||
|
@ -24,8 +24,7 @@ public:
|
|||||||
static constexpr auto name = "bitmaskToList";
|
static constexpr auto name = "bitmaskToList";
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionBitmaskToList>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionBitmaskToList>(); }
|
||||||
|
|
||||||
/// Получить основное имя функции.
|
String getName() const override
|
||||||
virtual String getName() const override
|
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
@ -33,8 +32,7 @@ public:
|
|||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
bool isInjective(const Block &) override { return true; }
|
bool isInjective(const Block &) override { return true; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
virtual DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
|
||||||
{
|
{
|
||||||
const IDataType * type = &*arguments[0];
|
const IDataType * type = &*arguments[0];
|
||||||
|
|
||||||
@ -51,7 +49,6 @@ public:
|
|||||||
return std::make_shared<DataTypeString>();
|
return std::make_shared<DataTypeString>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
if (!( executeType<UInt8>(block, arguments, result)
|
if (!( executeType<UInt8>(block, arguments, result)
|
||||||
@ -135,16 +132,14 @@ public:
|
|||||||
static constexpr auto name = "formatReadableSize";
|
static constexpr auto name = "formatReadableSize";
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionFormatReadableSize>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionFormatReadableSize>(); }
|
||||||
|
|
||||||
/// Получить основное имя функции.
|
String getName() const override
|
||||||
virtual String getName() const override
|
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
virtual DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
|
||||||
{
|
{
|
||||||
const IDataType & type = *arguments[0];
|
const IDataType & type = *arguments[0];
|
||||||
|
|
||||||
@ -154,7 +149,6 @@ public:
|
|||||||
return std::make_shared<DataTypeString>();
|
return std::make_shared<DataTypeString>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
if (!( executeType<UInt8>(block, arguments, result)
|
if (!( executeType<UInt8>(block, arguments, result)
|
||||||
|
@ -173,7 +173,6 @@ public:
|
|||||||
static constexpr auto name = Name::name;
|
static constexpr auto name = Name::name;
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionStringHash64>(); };
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionStringHash64>(); };
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -181,7 +180,6 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (!typeid_cast<const DataTypeString *>(&*arguments[0]))
|
if (!typeid_cast<const DataTypeString *>(&*arguments[0]))
|
||||||
@ -191,7 +189,6 @@ public:
|
|||||||
return std::make_shared<DataTypeUInt64>();
|
return std::make_shared<DataTypeUInt64>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
if (const ColumnString * col_from = typeid_cast<const ColumnString *>(block.safeGetByPosition(arguments[0]).column.get()))
|
if (const ColumnString * col_from = typeid_cast<const ColumnString *>(block.safeGetByPosition(arguments[0]).column.get()))
|
||||||
@ -231,7 +228,6 @@ public:
|
|||||||
static constexpr auto name = Impl::name;
|
static constexpr auto name = Impl::name;
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionStringHashFixedString>(); };
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionStringHashFixedString>(); };
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -239,7 +235,6 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (!typeid_cast<const DataTypeString *>(&*arguments[0]))
|
if (!typeid_cast<const DataTypeString *>(&*arguments[0]))
|
||||||
@ -249,7 +244,6 @@ public:
|
|||||||
return std::make_shared<DataTypeFixedString>(Impl::length);
|
return std::make_shared<DataTypeFixedString>(Impl::length);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
if (const ColumnString * col_from = typeid_cast<const ColumnString *>(block.safeGetByPosition(arguments[0]).column.get()))
|
if (const ColumnString * col_from = typeid_cast<const ColumnString *>(block.safeGetByPosition(arguments[0]).column.get()))
|
||||||
@ -326,7 +320,6 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -334,7 +327,6 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (!arguments[0]->isNumeric())
|
if (!arguments[0]->isNumeric())
|
||||||
@ -344,7 +336,6 @@ public:
|
|||||||
return std::make_shared<typename DataTypeFromFieldType<typename Impl::ReturnType>::Type>();
|
return std::make_shared<typename DataTypeFromFieldType<typename Impl::ReturnType>::Type>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
IDataType * from_type = block.safeGetByPosition(arguments[0]).type.get();
|
IDataType * from_type = block.safeGetByPosition(arguments[0]).type.get();
|
||||||
|
@ -601,7 +601,6 @@ public:
|
|||||||
static constexpr auto name = Name::name;
|
static constexpr auto name = Name::name;
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionArrayMapped>(); };
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionArrayMapped>(); };
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -689,17 +688,17 @@ public:
|
|||||||
|
|
||||||
/// Попросим добавить в блок все столбцы, упоминаемые в выражении, размноженные в массив, параллельный обрабатываемому.
|
/// Попросим добавить в блок все столбцы, упоминаемые в выражении, размноженные в массив, параллельный обрабатываемому.
|
||||||
const ExpressionActions & expression = *column_expression->getExpression();
|
const ExpressionActions & expression = *column_expression->getExpression();
|
||||||
Names required_columns = expression.getRequiredColumns();
|
const NamesAndTypesList & required_columns = expression.getRequiredColumnsWithTypes();
|
||||||
|
|
||||||
Names argument_name_vector = column_expression->getArgumentNames();
|
Names argument_name_vector = column_expression->getArgumentNames();
|
||||||
NameSet argument_names(argument_name_vector.begin(), argument_name_vector.end());
|
NameSet argument_names(argument_name_vector.begin(), argument_name_vector.end());
|
||||||
|
|
||||||
for (size_t i = 0; i < required_columns.size(); ++i)
|
for (const auto & required_column : required_columns)
|
||||||
{
|
{
|
||||||
if (argument_names.count(required_columns[i]))
|
if (argument_names.count(required_column.name))
|
||||||
continue;
|
continue;
|
||||||
Names replicate_arguments;
|
Names replicate_arguments;
|
||||||
replicate_arguments.push_back(required_columns[i]);
|
replicate_arguments.push_back(required_column.name);
|
||||||
replicate_arguments.push_back(arguments[1].name);
|
replicate_arguments.push_back(arguments[1].name);
|
||||||
out_prerequisites.push_back(ExpressionAction::applyFunction(std::make_shared<FunctionReplicate>(), replicate_arguments));
|
out_prerequisites.push_back(ExpressionAction::applyFunction(std::make_shared<FunctionReplicate>(), replicate_arguments));
|
||||||
}
|
}
|
||||||
@ -715,7 +714,6 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, const ColumnNumbers & prerequisites, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, const ColumnNumbers & prerequisites, size_t result) override
|
||||||
{
|
{
|
||||||
if (arguments.size() == 1)
|
if (arguments.size() == 1)
|
||||||
|
@ -241,7 +241,6 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -270,7 +269,6 @@ public:
|
|||||||
return std::make_shared<DataTypeUInt8>();
|
return std::make_shared<DataTypeUInt8>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
ColumnPlainPtrs in(arguments.size());
|
ColumnPlainPtrs in(arguments.size());
|
||||||
@ -398,7 +396,6 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -406,7 +403,6 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
|
|
||||||
/// Получить типы результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (!arguments[0]->isNumeric())
|
if (!arguments[0]->isNumeric())
|
||||||
@ -418,7 +414,6 @@ public:
|
|||||||
return std::make_shared<DataTypeUInt8>();
|
return std::make_shared<DataTypeUInt8>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
if (!( executeType<UInt8>(block, arguments, result)
|
if (!( executeType<UInt8>(block, arguments, result)
|
||||||
|
@ -120,7 +120,6 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 0; }
|
size_t getNumberOfArguments() const override { return 0; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
return std::make_shared<DataTypeString>();
|
return std::make_shared<DataTypeString>();
|
||||||
@ -149,7 +148,6 @@ public:
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -157,13 +155,11 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
return std::make_shared<DataTypeUInt64>();
|
return std::make_shared<DataTypeUInt64>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override;
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -187,13 +183,11 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
return std::make_shared<DataTypeString>();
|
return std::make_shared<DataTypeString>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
block.safeGetByPosition(result).column = std::make_shared<ColumnConstString>(
|
block.safeGetByPosition(result).column = std::make_shared<ColumnConstString>(
|
||||||
@ -240,7 +234,6 @@ public:
|
|||||||
static constexpr auto name = "blockSize";
|
static constexpr auto name = "blockSize";
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionBlockSize>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionBlockSize>(); }
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -250,13 +243,11 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 0; }
|
size_t getNumberOfArguments() const override { return 0; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
return std::make_shared<DataTypeUInt64>();
|
return std::make_shared<DataTypeUInt64>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
size_t size = block.rows();
|
size_t size = block.rows();
|
||||||
@ -271,7 +262,6 @@ public:
|
|||||||
static constexpr auto name = "rowNumberInBlock";
|
static constexpr auto name = "rowNumberInBlock";
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionRowNumberInBlock>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionRowNumberInBlock>(); }
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -281,13 +271,11 @@ public:
|
|||||||
|
|
||||||
bool isDeterministicInScopeOfQuery() override { return false; }
|
bool isDeterministicInScopeOfQuery() override { return false; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
return std::make_shared<DataTypeUInt64>();
|
return std::make_shared<DataTypeUInt64>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
size_t size = block.rows();
|
size_t size = block.rows();
|
||||||
@ -312,7 +300,6 @@ public:
|
|||||||
static constexpr auto name = "blockNumber";
|
static constexpr auto name = "blockNumber";
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionBlockNumber>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionBlockNumber>(); }
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -322,13 +309,11 @@ public:
|
|||||||
|
|
||||||
bool isDeterministicInScopeOfQuery() override { return false; }
|
bool isDeterministicInScopeOfQuery() override { return false; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
return std::make_shared<DataTypeUInt64>();
|
return std::make_shared<DataTypeUInt64>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
size_t current_block_number = block_number++;
|
size_t current_block_number = block_number++;
|
||||||
@ -347,7 +332,6 @@ public:
|
|||||||
static constexpr auto name = "rowNumberInAllBlocks";
|
static constexpr auto name = "rowNumberInAllBlocks";
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionRowNumberInAllBlocks>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionRowNumberInAllBlocks>(); }
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -357,13 +341,11 @@ public:
|
|||||||
|
|
||||||
bool isDeterministicInScopeOfQuery() override { return false; }
|
bool isDeterministicInScopeOfQuery() override { return false; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
return std::make_shared<DataTypeUInt64>();
|
return std::make_shared<DataTypeUInt64>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
size_t rows_in_block = block.rows();
|
size_t rows_in_block = block.rows();
|
||||||
@ -386,7 +368,6 @@ public:
|
|||||||
static constexpr auto name = "sleep";
|
static constexpr auto name = "sleep";
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionSleep>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionSleep>(); }
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -397,7 +378,6 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (!typeid_cast<const DataTypeFloat64 *>(&*arguments[0]) &&
|
if (!typeid_cast<const DataTypeFloat64 *>(&*arguments[0]) &&
|
||||||
@ -412,7 +392,6 @@ public:
|
|||||||
return std::make_shared<DataTypeUInt8>();
|
return std::make_shared<DataTypeUInt8>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
IColumn * col = block.safeGetByPosition(arguments[0]).column.get();
|
IColumn * col = block.safeGetByPosition(arguments[0]).column.get();
|
||||||
@ -456,7 +435,6 @@ public:
|
|||||||
static constexpr auto name = "materialize";
|
static constexpr auto name = "materialize";
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionMaterialize>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionMaterialize>(); }
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -464,13 +442,11 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
return arguments[0];
|
return arguments[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
const auto & src = block.safeGetByPosition(arguments[0]).column;
|
const auto & src = block.safeGetByPosition(arguments[0]).column;
|
||||||
@ -501,13 +477,11 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 2; }
|
size_t getNumberOfArguments() const override { return 2; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
return std::make_shared<DataTypeUInt8>();
|
return std::make_shared<DataTypeUInt8>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
/// Second argument must be ColumnSet.
|
/// Second argument must be ColumnSet.
|
||||||
@ -552,7 +526,6 @@ public:
|
|||||||
|
|
||||||
bool hasSpecialSupportForNulls() const override { return true; }
|
bool hasSpecialSupportForNulls() const override { return true; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (arguments.size() < 1)
|
if (arguments.size() < 1)
|
||||||
@ -561,7 +534,6 @@ public:
|
|||||||
return std::make_shared<DataTypeTuple>(arguments);
|
return std::make_shared<DataTypeTuple>(arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
Block tuple_block;
|
Block tuple_block;
|
||||||
@ -647,7 +619,6 @@ public:
|
|||||||
out_return_type = elems[index - 1]->clone();
|
out_return_type = elems[index - 1]->clone();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
const ColumnTuple * tuple_col = typeid_cast<const ColumnTuple *>(block.safeGetByPosition(arguments[0]).column.get());
|
const ColumnTuple * tuple_col = typeid_cast<const ColumnTuple *>(block.safeGetByPosition(arguments[0]).column.get());
|
||||||
@ -697,7 +668,6 @@ public:
|
|||||||
String getName() const override { return name; }
|
String getName() const override { return name; }
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { return std::make_shared<DataTypeUInt8>(); }
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { return std::make_shared<DataTypeUInt8>(); }
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
block.safeGetByPosition(result).column = std::make_shared<ColumnConstUInt8>(block.rows(), 0);
|
block.safeGetByPosition(result).column = std::make_shared<ColumnConstUInt8>(block.rows(), 0);
|
||||||
@ -731,7 +701,6 @@ public:
|
|||||||
String getName() const override { return name; }
|
String getName() const override { return name; }
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { return std::make_shared<DataTypeUInt8>(); }
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { return std::make_shared<DataTypeUInt8>(); }
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
block.safeGetByPosition(result).column = std::make_shared<ColumnConstUInt8>(block.rows(), 1);
|
block.safeGetByPosition(result).column = std::make_shared<ColumnConstUInt8>(block.rows(), 1);
|
||||||
@ -745,7 +714,6 @@ public:
|
|||||||
static constexpr auto name = "identity";
|
static constexpr auto name = "identity";
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionIdentity>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionIdentity>(); }
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -753,13 +721,11 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
return arguments.front()->clone();
|
return arguments.front()->clone();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
block.safeGetByPosition(result).column = block.safeGetByPosition(arguments.front()).column;
|
block.safeGetByPosition(result).column = block.safeGetByPosition(arguments.front()).column;
|
||||||
@ -773,8 +739,6 @@ public:
|
|||||||
static constexpr auto name = "arrayJoin";
|
static constexpr auto name = "arrayJoin";
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionArrayJoin>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionArrayJoin>(); }
|
||||||
|
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -785,7 +749,6 @@ public:
|
|||||||
/** It could return many different values for single argument. */
|
/** It could return many different values for single argument. */
|
||||||
bool isDeterministicInScopeOfQuery() override { return false; }
|
bool isDeterministicInScopeOfQuery() override { return false; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
const DataTypeArray * arr = typeid_cast<const DataTypeArray *>(&*arguments[0]);
|
const DataTypeArray * arr = typeid_cast<const DataTypeArray *>(&*arguments[0]);
|
||||||
@ -795,7 +758,6 @@ public:
|
|||||||
return arr->getNestedType()->clone();
|
return arr->getNestedType()->clone();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
throw Exception("Function " + getName() + " must not be executed directly.", ErrorCodes::FUNCTION_IS_SPECIAL);
|
throw Exception("Function " + getName() + " must not be executed directly.", ErrorCodes::FUNCTION_IS_SPECIAL);
|
||||||
@ -815,7 +777,6 @@ public:
|
|||||||
static constexpr auto name = "replicate";
|
static constexpr auto name = "replicate";
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionReplicate>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionReplicate>(); }
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -823,7 +784,6 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 2; }
|
size_t getNumberOfArguments() const override { return 2; }
|
||||||
|
|
||||||
/// Получить типы результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
const DataTypeArray * array_type = typeid_cast<const DataTypeArray *>(&*arguments[1]);
|
const DataTypeArray * array_type = typeid_cast<const DataTypeArray *>(&*arguments[1]);
|
||||||
@ -833,7 +793,6 @@ public:
|
|||||||
return std::make_shared<DataTypeArray>(arguments[0]->clone());
|
return std::make_shared<DataTypeArray>(arguments[0]->clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
ColumnPtr first_column = block.safeGetByPosition(arguments[0]).column;
|
ColumnPtr first_column = block.safeGetByPosition(arguments[0]).column;
|
||||||
@ -873,7 +832,6 @@ public:
|
|||||||
bool isVariadic() const override { return true; }
|
bool isVariadic() const override { return true; }
|
||||||
size_t getNumberOfArguments() const override { return 0; }
|
size_t getNumberOfArguments() const override { return 0; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (arguments.size() != 3 && arguments.size() != 4)
|
if (arguments.size() != 3 && arguments.size() != 4)
|
||||||
@ -888,7 +846,6 @@ public:
|
|||||||
return std::make_shared<DataTypeString>();
|
return std::make_shared<DataTypeString>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
Int64 min = extractConstant<Int64>(block, arguments, 1, "Second"); /// Уровень значения, при котором полоска имеет нулевую длину.
|
Int64 min = extractConstant<Int64>(block, arguments, 1, "Second"); /// Уровень значения, при котором полоска имеет нулевую длину.
|
||||||
|
@ -152,7 +152,6 @@ public:
|
|||||||
static constexpr auto name = Name::name;
|
static constexpr auto name = Name::name;
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionRandom>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionRandom>(); }
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -162,7 +161,6 @@ public:
|
|||||||
size_t getNumberOfArguments() const override { return 0; }
|
size_t getNumberOfArguments() const override { return 0; }
|
||||||
bool isDeterministicInScopeOfQuery() override { return false; }
|
bool isDeterministicInScopeOfQuery() override { return false; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (arguments.size() > 1)
|
if (arguments.size() > 1)
|
||||||
@ -173,7 +171,6 @@ public:
|
|||||||
return std::make_shared<typename DataTypeFromFieldType<typename Impl::ReturnType>::Type>();
|
return std::make_shared<typename DataTypeFromFieldType<typename Impl::ReturnType>::Type>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
auto col_to = std::make_shared<ColumnVector<ToType>>();
|
auto col_to = std::make_shared<ColumnVector<ToType>>();
|
||||||
@ -202,7 +199,6 @@ public:
|
|||||||
static constexpr auto name = Name::name;
|
static constexpr auto name = Name::name;
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionRandomConstant>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionRandomConstant>(); }
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -211,7 +207,6 @@ public:
|
|||||||
bool isVariadic() const override { return true; }
|
bool isVariadic() const override { return true; }
|
||||||
size_t getNumberOfArguments() const override { return 0; }
|
size_t getNumberOfArguments() const override { return 0; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (arguments.size() > 1)
|
if (arguments.size() > 1)
|
||||||
@ -222,7 +217,6 @@ public:
|
|||||||
return std::make_shared<typename DataTypeFromFieldType<typename Impl::ReturnType>::Type>();
|
return std::make_shared<typename DataTypeFromFieldType<typename Impl::ReturnType>::Type>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
if (!is_initialized)
|
if (!is_initialized)
|
||||||
|
@ -26,7 +26,6 @@ public:
|
|||||||
static constexpr auto name = Name::name;
|
static constexpr auto name = Name::name;
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionReinterpretAsStringImpl>(); };
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionReinterpretAsStringImpl>(); };
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -34,7 +33,6 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
const IDataType * type = &*arguments[0];
|
const IDataType * type = &*arguments[0];
|
||||||
@ -93,7 +91,6 @@ public:
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
if (!( executeType<UInt8>(block, arguments, result)
|
if (!( executeType<UInt8>(block, arguments, result)
|
||||||
@ -121,7 +118,6 @@ public:
|
|||||||
|
|
||||||
using ToFieldType = typename ToDataType::FieldType;
|
using ToFieldType = typename ToDataType::FieldType;
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -129,7 +125,6 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
const IDataType * type = &*arguments[0];
|
const IDataType * type = &*arguments[0];
|
||||||
@ -140,7 +135,6 @@ public:
|
|||||||
return std::make_shared<ToDataType>();
|
return std::make_shared<ToDataType>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
if (ColumnString * col_from = typeid_cast<ColumnString *>(block.safeGetByPosition(arguments[0]).column.get()))
|
if (ColumnString * col_from = typeid_cast<ColumnString *>(block.safeGetByPosition(arguments[0]).column.get()))
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -772,7 +772,6 @@ public:
|
|||||||
static constexpr auto name = Name::name;
|
static constexpr auto name = Name::name;
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionStringOrArrayToT>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionStringOrArrayToT>(); }
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -780,7 +779,6 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (!typeid_cast<const DataTypeString *>(&*arguments[0]) && !typeid_cast<const DataTypeFixedString *>(&*arguments[0])
|
if (!typeid_cast<const DataTypeString *>(&*arguments[0]) && !typeid_cast<const DataTypeFixedString *>(&*arguments[0])
|
||||||
@ -791,7 +789,6 @@ public:
|
|||||||
return std::make_shared<typename DataTypeFromFieldType<ResultType>::Type>();
|
return std::make_shared<typename DataTypeFromFieldType<ResultType>::Type>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
const ColumnPtr column = block.safeGetByPosition(arguments[0]).column;
|
const ColumnPtr column = block.safeGetByPosition(arguments[0]).column;
|
||||||
@ -865,7 +862,6 @@ public:
|
|||||||
static constexpr auto name = Name::name;
|
static constexpr auto name = Name::name;
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionStringToString>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionStringToString>(); }
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -874,7 +870,6 @@ public:
|
|||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
bool isInjective(const Block &) override { return is_injective; }
|
bool isInjective(const Block &) override { return is_injective; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (!typeid_cast<const DataTypeString *>(&*arguments[0]) && !typeid_cast<const DataTypeFixedString *>(&*arguments[0]))
|
if (!typeid_cast<const DataTypeString *>(&*arguments[0]) && !typeid_cast<const DataTypeFixedString *>(&*arguments[0]))
|
||||||
@ -884,7 +879,6 @@ public:
|
|||||||
return arguments[0]->clone();
|
return arguments[0]->clone();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
const ColumnPtr column = block.safeGetByPosition(arguments[0]).column;
|
const ColumnPtr column = block.safeGetByPosition(arguments[0]).column;
|
||||||
@ -924,14 +918,12 @@ public:
|
|||||||
static constexpr auto name = "reverse";
|
static constexpr auto name = "reverse";
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionReverse>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionReverse>(); }
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override;
|
String getName() const override;
|
||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
bool isInjective(const Block &) override { return true; }
|
bool isInjective(const Block &) override { return true; }
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override;
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override;
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override;
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -943,7 +935,6 @@ public:
|
|||||||
static constexpr auto name = Name::name;
|
static constexpr auto name = Name::name;
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<ConcatImpl>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<ConcatImpl>(); }
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -953,7 +944,6 @@ public:
|
|||||||
size_t getNumberOfArguments() const override { return 0; }
|
size_t getNumberOfArguments() const override { return 0; }
|
||||||
bool isInjective(const Block &) override { return is_injective; }
|
bool isInjective(const Block &) override { return is_injective; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (arguments.size() < 2)
|
if (arguments.size() < 2)
|
||||||
@ -1426,7 +1416,6 @@ public:
|
|||||||
static constexpr auto name = Name::name;
|
static constexpr auto name = Name::name;
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionStringNumNumToString>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionStringNumNumToString>(); }
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -1434,7 +1423,6 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 3; }
|
size_t getNumberOfArguments() const override { return 3; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (!typeid_cast<const DataTypeString *>(&*arguments[0]) && !typeid_cast<const DataTypeFixedString *>(&*arguments[0]))
|
if (!typeid_cast<const DataTypeString *>(&*arguments[0]) && !typeid_cast<const DataTypeFixedString *>(&*arguments[0]))
|
||||||
@ -1448,7 +1436,6 @@ public:
|
|||||||
return std::make_shared<DataTypeString>();
|
return std::make_shared<DataTypeString>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
const ColumnPtr column_string = block.safeGetByPosition(arguments[0]).column;
|
const ColumnPtr column_string = block.safeGetByPosition(arguments[0]).column;
|
||||||
|
@ -310,7 +310,6 @@ public:
|
|||||||
static constexpr auto name = Generator::name;
|
static constexpr auto name = Generator::name;
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionTokens>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionTokens>(); }
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -318,7 +317,6 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return Generator::getNumberOfArguments(); }
|
size_t getNumberOfArguments() const override { return Generator::getNumberOfArguments(); }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
Generator::checkArguments(arguments);
|
Generator::checkArguments(arguments);
|
||||||
@ -326,7 +324,6 @@ public:
|
|||||||
return std::make_shared<DataTypeArray>(std::make_shared<DataTypeString>());
|
return std::make_shared<DataTypeArray>(std::make_shared<DataTypeString>());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
Generator generator;
|
Generator generator;
|
||||||
@ -477,7 +474,6 @@ public:
|
|||||||
static constexpr auto name = "arrayStringConcat";
|
static constexpr auto name = "arrayStringConcat";
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionArrayStringConcat>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionArrayStringConcat>(); }
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -486,7 +482,6 @@ public:
|
|||||||
bool isVariadic() const override { return true; }
|
bool isVariadic() const override { return true; }
|
||||||
size_t getNumberOfArguments() const override { return 0; }
|
size_t getNumberOfArguments() const override { return 0; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (arguments.size() != 1 && arguments.size() != 2)
|
if (arguments.size() != 1 && arguments.size() != 2)
|
||||||
@ -505,7 +500,6 @@ public:
|
|||||||
return std::make_shared<DataTypeString>();
|
return std::make_shared<DataTypeString>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
String delimiter;
|
String delimiter;
|
||||||
|
@ -1038,7 +1038,6 @@ public:
|
|||||||
static constexpr auto name = Name::name;
|
static constexpr auto name = Name::name;
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionStringReplace>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionStringReplace>(); }
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -1046,7 +1045,6 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 3; }
|
size_t getNumberOfArguments() const override { return 3; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (!typeid_cast<const DataTypeString *>(&*arguments[0]) && !typeid_cast<const DataTypeFixedString *>(&*arguments[0]))
|
if (!typeid_cast<const DataTypeString *>(&*arguments[0]) && !typeid_cast<const DataTypeFixedString *>(&*arguments[0]))
|
||||||
@ -1064,7 +1062,6 @@ public:
|
|||||||
return std::make_shared<DataTypeString>();
|
return std::make_shared<DataTypeString>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
const ColumnPtr column_src = block.safeGetByPosition(arguments[0]).column;
|
const ColumnPtr column_src = block.safeGetByPosition(arguments[0]).column;
|
||||||
@ -1122,7 +1119,6 @@ public:
|
|||||||
static constexpr auto name = Name::name;
|
static constexpr auto name = Name::name;
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionsStringSearch>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionsStringSearch>(); }
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -1130,7 +1126,6 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 2; }
|
size_t getNumberOfArguments() const override { return 2; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (!typeid_cast<const DataTypeString *>(&*arguments[0]))
|
if (!typeid_cast<const DataTypeString *>(&*arguments[0]))
|
||||||
@ -1144,7 +1139,6 @@ public:
|
|||||||
return std::make_shared<typename DataTypeFromFieldType<typename Impl::ResultType>::Type>();
|
return std::make_shared<typename DataTypeFromFieldType<typename Impl::ResultType>::Type>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
using ResultType = typename Impl::ResultType;
|
using ResultType = typename Impl::ResultType;
|
||||||
@ -1204,7 +1198,6 @@ public:
|
|||||||
static constexpr auto name = Name::name;
|
static constexpr auto name = Name::name;
|
||||||
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionsStringSearchToString>(); }
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionsStringSearchToString>(); }
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
@ -1212,7 +1205,6 @@ public:
|
|||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 2; }
|
size_t getNumberOfArguments() const override { return 2; }
|
||||||
|
|
||||||
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
||||||
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
|
||||||
{
|
{
|
||||||
if (!typeid_cast<const DataTypeString *>(&*arguments[0]))
|
if (!typeid_cast<const DataTypeString *>(&*arguments[0]))
|
||||||
@ -1226,7 +1218,6 @@ public:
|
|||||||
return std::make_shared<DataTypeString>();
|
return std::make_shared<DataTypeString>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result) override
|
||||||
{
|
{
|
||||||
const ColumnPtr column = block.safeGetByPosition(arguments[0]).column;
|
const ColumnPtr column = block.safeGetByPosition(arguments[0]).column;
|
||||||
|
@ -135,7 +135,10 @@ private:
|
|||||||
|
|
||||||
ClusterPtr getCluster() const;
|
ClusterPtr getCluster() const;
|
||||||
|
|
||||||
private:
|
/// Get monotonically increasing string to name files with data to be written to remote servers.
|
||||||
|
String getMonotonicFileName();
|
||||||
|
|
||||||
|
|
||||||
String name;
|
String name;
|
||||||
NamesAndTypesListPtr columns;
|
NamesAndTypesListPtr columns;
|
||||||
String remote_database;
|
String remote_database;
|
||||||
|
@ -1,10 +1,337 @@
|
|||||||
|
#include <string.h> // memcpy
|
||||||
|
|
||||||
#include <DB/Columns/ColumnArray.h>
|
#include <DB/Columns/ColumnArray.h>
|
||||||
|
#include <DB/Columns/ColumnsNumber.h>
|
||||||
|
#include <DB/Columns/ColumnString.h>
|
||||||
#include <DB/Columns/ColumnsCommon.h>
|
#include <DB/Columns/ColumnsCommon.h>
|
||||||
|
|
||||||
|
#include <DB/Common/Exception.h>
|
||||||
|
#include <DB/Common/Arena.h>
|
||||||
|
#include <DB/Common/SipHash.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
|
|
||||||
|
namespace ErrorCodes
|
||||||
|
{
|
||||||
|
extern const int ILLEGAL_COLUMN;
|
||||||
|
extern const int NOT_IMPLEMENTED;
|
||||||
|
extern const int BAD_ARGUMENTS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ColumnArray::ColumnArray(ColumnPtr nested_column, ColumnPtr offsets_column)
|
||||||
|
: data(nested_column), offsets(offsets_column)
|
||||||
|
{
|
||||||
|
if (!offsets_column)
|
||||||
|
{
|
||||||
|
offsets = std::make_shared<ColumnOffsets_t>();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!typeid_cast<ColumnOffsets_t *>(&*offsets_column))
|
||||||
|
throw Exception("offsets_column must be a ColumnUInt64", ErrorCodes::ILLEGAL_COLUMN);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** NOTE
|
||||||
|
* Arrays with constant value are possible and used in implementation of higher order functions and in ARRAY JOIN.
|
||||||
|
* But in most cases, arrays with constant value are unexpected and code will work wrong. Use with caution.
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string ColumnArray::getName() const { return "ColumnArray(" + getData().getName() + ")"; }
|
||||||
|
|
||||||
|
|
||||||
|
ColumnPtr ColumnArray::cloneResized(size_t to_size) const
|
||||||
|
{
|
||||||
|
auto res = std::make_shared<ColumnArray>(getData().cloneEmpty());
|
||||||
|
|
||||||
|
if (to_size == 0)
|
||||||
|
return res;
|
||||||
|
|
||||||
|
size_t from_size = size();
|
||||||
|
|
||||||
|
if (to_size <= from_size)
|
||||||
|
{
|
||||||
|
/// Just cut column.
|
||||||
|
|
||||||
|
res->getOffsets().assign(getOffsets().begin(), getOffsets().begin() + to_size);
|
||||||
|
res->getData().insertRangeFrom(getData(), 0, getOffsets()[to_size - 1]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/// Copy column and append empty arrays for extra elements.
|
||||||
|
|
||||||
|
Offset_t offset = 0;
|
||||||
|
if (from_size > 0)
|
||||||
|
{
|
||||||
|
res->getOffsets().assign(getOffsets().begin(), getOffsets().end());
|
||||||
|
res->getDataPtr() = getData().clone();
|
||||||
|
offset = getOffsets().back();
|
||||||
|
}
|
||||||
|
|
||||||
|
res->getOffsets().resize(to_size);
|
||||||
|
for (size_t i = from_size; i < to_size; ++i)
|
||||||
|
{
|
||||||
|
++offset;
|
||||||
|
res->getOffsets()[i] = offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
size_t ColumnArray::size() const
|
||||||
|
{
|
||||||
|
return getOffsets().size();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Field ColumnArray::operator[](size_t n) const
|
||||||
|
{
|
||||||
|
size_t offset = offsetAt(n);
|
||||||
|
size_t size = sizeAt(n);
|
||||||
|
Array res(size);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < size; ++i)
|
||||||
|
res[i] = getData()[offset + i];
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ColumnArray::get(size_t n, Field & res) const
|
||||||
|
{
|
||||||
|
size_t offset = offsetAt(n);
|
||||||
|
size_t size = sizeAt(n);
|
||||||
|
res = Array(size);
|
||||||
|
Array & res_arr = DB::get<Array &>(res);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < size; ++i)
|
||||||
|
getData().get(offset + i, res_arr[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
StringRef ColumnArray::getDataAt(size_t n) const
|
||||||
|
{
|
||||||
|
/** Возвращает диапазон памяти, покрывающий все элементы массива.
|
||||||
|
* Работает для массивов значений фиксированной длины.
|
||||||
|
* Для массивов строк и массивов массивов полученный кусок памяти может не взаимно-однозначно соответствовать элементам,
|
||||||
|
* так как содержит лишь уложенные подряд данные, но не смещения.
|
||||||
|
*/
|
||||||
|
|
||||||
|
size_t array_size = sizeAt(n);
|
||||||
|
if (array_size == 0)
|
||||||
|
return StringRef();
|
||||||
|
|
||||||
|
size_t offset_of_first_elem = offsetAt(n);
|
||||||
|
StringRef first = getData().getDataAtWithTerminatingZero(offset_of_first_elem);
|
||||||
|
|
||||||
|
size_t offset_of_last_elem = getOffsets()[n] - 1;
|
||||||
|
StringRef last = getData().getDataAtWithTerminatingZero(offset_of_last_elem);
|
||||||
|
|
||||||
|
return StringRef(first.data, last.data + last.size - first.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ColumnArray::insertData(const char * pos, size_t length)
|
||||||
|
{
|
||||||
|
/** Аналогично - только для массивов значений фиксированной длины.
|
||||||
|
*/
|
||||||
|
IColumn * data_ = data.get();
|
||||||
|
if (!data_->isFixed())
|
||||||
|
throw Exception("Method insertData is not supported for " + getName(), ErrorCodes::NOT_IMPLEMENTED);
|
||||||
|
|
||||||
|
size_t field_size = data_->sizeOfField();
|
||||||
|
|
||||||
|
const char * end = pos + length;
|
||||||
|
size_t elems = 0;
|
||||||
|
for (; pos + field_size <= end; pos += field_size, ++elems)
|
||||||
|
data_->insertData(pos, field_size);
|
||||||
|
|
||||||
|
if (pos != end)
|
||||||
|
throw Exception("Incorrect length argument for method ColumnArray::insertData", ErrorCodes::BAD_ARGUMENTS);
|
||||||
|
|
||||||
|
getOffsets().push_back((getOffsets().size() == 0 ? 0 : getOffsets().back()) + elems);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
StringRef ColumnArray::serializeValueIntoArena(size_t n, Arena & arena, char const *& begin) const
|
||||||
|
{
|
||||||
|
size_t array_size = sizeAt(n);
|
||||||
|
size_t offset = offsetAt(n);
|
||||||
|
|
||||||
|
char * pos = arena.allocContinue(sizeof(array_size), begin);
|
||||||
|
memcpy(pos, &array_size, sizeof(array_size));
|
||||||
|
|
||||||
|
size_t values_size = 0;
|
||||||
|
for (size_t i = 0; i < array_size; ++i)
|
||||||
|
values_size += getData().serializeValueIntoArena(offset + i, arena, begin).size;
|
||||||
|
|
||||||
|
return StringRef(begin, sizeof(array_size) + values_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const char * ColumnArray::deserializeAndInsertFromArena(const char * pos)
|
||||||
|
{
|
||||||
|
size_t array_size = *reinterpret_cast<const size_t *>(pos);
|
||||||
|
pos += sizeof(array_size);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < array_size; ++i)
|
||||||
|
pos = getData().deserializeAndInsertFromArena(pos);
|
||||||
|
|
||||||
|
getOffsets().push_back((getOffsets().size() == 0 ? 0 : getOffsets().back()) + array_size);
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ColumnArray::updateHashWithValue(size_t n, SipHash & hash) const
|
||||||
|
{
|
||||||
|
size_t array_size = sizeAt(n);
|
||||||
|
size_t offset = offsetAt(n);
|
||||||
|
|
||||||
|
hash.update(reinterpret_cast<const char *>(&array_size), sizeof(array_size));
|
||||||
|
for (size_t i = 0; i < array_size; ++i)
|
||||||
|
getData().updateHashWithValue(offset + i, hash);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ColumnArray::insert(const Field & x)
|
||||||
|
{
|
||||||
|
const Array & array = DB::get<const Array &>(x);
|
||||||
|
size_t size = array.size();
|
||||||
|
for (size_t i = 0; i < size; ++i)
|
||||||
|
getData().insert(array[i]);
|
||||||
|
getOffsets().push_back((getOffsets().size() == 0 ? 0 : getOffsets().back()) + size);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ColumnArray::insertFrom(const IColumn & src_, size_t n)
|
||||||
|
{
|
||||||
|
const ColumnArray & src = static_cast<const ColumnArray &>(src_);
|
||||||
|
size_t size = src.sizeAt(n);
|
||||||
|
size_t offset = src.offsetAt(n);
|
||||||
|
|
||||||
|
getData().insertRangeFrom(src.getData(), offset, size);
|
||||||
|
getOffsets().push_back((getOffsets().size() == 0 ? 0 : getOffsets().back()) + size);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ColumnArray::insertDefault()
|
||||||
|
{
|
||||||
|
getOffsets().push_back(getOffsets().size() == 0 ? 0 : getOffsets().back());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ColumnArray::popBack(size_t n)
|
||||||
|
{
|
||||||
|
auto & offsets = getOffsets();
|
||||||
|
size_t nested_n = offsets.back() - offsetAt(offsets.size() - n);
|
||||||
|
if (nested_n)
|
||||||
|
getData().popBack(nested_n);
|
||||||
|
offsets.resize_assume_reserved(offsets.size() - n);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int ColumnArray::compareAt(size_t n, size_t m, const IColumn & rhs_, int nan_direction_hint) const
|
||||||
|
{
|
||||||
|
const ColumnArray & rhs = static_cast<const ColumnArray &>(rhs_);
|
||||||
|
|
||||||
|
/// Не оптимально
|
||||||
|
size_t lhs_size = sizeAt(n);
|
||||||
|
size_t rhs_size = rhs.sizeAt(m);
|
||||||
|
size_t min_size = std::min(lhs_size, rhs_size);
|
||||||
|
for (size_t i = 0; i < min_size; ++i)
|
||||||
|
if (int res = getData().compareAt(offsetAt(n) + i, rhs.offsetAt(m) + i, *rhs.data.get(), nan_direction_hint))
|
||||||
|
return res;
|
||||||
|
|
||||||
|
return lhs_size < rhs_size
|
||||||
|
? -1
|
||||||
|
: (lhs_size == rhs_size
|
||||||
|
? 0
|
||||||
|
: 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
template <bool positive>
|
||||||
|
struct less
|
||||||
|
{
|
||||||
|
const ColumnArray & parent;
|
||||||
|
|
||||||
|
less(const ColumnArray & parent_) : parent(parent_) {}
|
||||||
|
|
||||||
|
bool operator()(size_t lhs, size_t rhs) const
|
||||||
|
{
|
||||||
|
if (positive)
|
||||||
|
return parent.compareAt(lhs, rhs, parent, 1) < 0;
|
||||||
|
else
|
||||||
|
return parent.compareAt(lhs, rhs, parent, -1) > 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ColumnArray::reserve(size_t n)
|
||||||
|
{
|
||||||
|
getOffsets().reserve(n);
|
||||||
|
getData().reserve(n); /// Средний размер массивов тут никак не учитывается. Или считается, что он не больше единицы.
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
size_t ColumnArray::byteSize() const
|
||||||
|
{
|
||||||
|
return getData().byteSize() + getOffsets().size() * sizeof(getOffsets()[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
size_t ColumnArray::allocatedSize() const
|
||||||
|
{
|
||||||
|
return getData().allocatedSize() + getOffsets().allocated_size() * sizeof(getOffsets()[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool ColumnArray::hasEqualOffsets(const ColumnArray & other) const
|
||||||
|
{
|
||||||
|
if (offsets == other.offsets)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
const Offsets_t & offsets1 = getOffsets();
|
||||||
|
const Offsets_t & offsets2 = other.getOffsets();
|
||||||
|
return offsets1.size() == offsets2.size() && 0 == memcmp(&offsets1[0], &offsets2[0], sizeof(offsets1[0]) * offsets1.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ColumnPtr ColumnArray::convertToFullColumnIfConst() const
|
||||||
|
{
|
||||||
|
ColumnPtr new_data;
|
||||||
|
ColumnPtr new_offsets;
|
||||||
|
|
||||||
|
if (auto full_column = getData().convertToFullColumnIfConst())
|
||||||
|
new_data = full_column;
|
||||||
|
else
|
||||||
|
new_data = data;
|
||||||
|
|
||||||
|
if (auto full_column = offsets.get()->convertToFullColumnIfConst())
|
||||||
|
new_offsets = full_column;
|
||||||
|
else
|
||||||
|
new_offsets = offsets;
|
||||||
|
|
||||||
|
return std::make_shared<ColumnArray>(new_data, new_offsets);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ColumnArray::getExtremes(Field & min, Field & max) const
|
||||||
|
{
|
||||||
|
min = Array();
|
||||||
|
max = Array();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void ColumnArray::insertRangeFrom(const IColumn & src, size_t start, size_t length)
|
void ColumnArray::insertRangeFrom(const IColumn & src, size_t start, size_t length)
|
||||||
{
|
{
|
||||||
|
@ -1,10 +1,262 @@
|
|||||||
|
#include <DB/Core/Defines.h>
|
||||||
|
|
||||||
#include <DB/Common/Collator.h>
|
#include <DB/Common/Collator.h>
|
||||||
#include <DB/Columns/ColumnString.h>
|
#include <DB/Columns/ColumnString.h>
|
||||||
|
#include <DB/Columns/ColumnsCommon.h>
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
|
|
||||||
|
namespace ErrorCodes
|
||||||
|
{
|
||||||
|
extern const int PARAMETER_OUT_OF_BOUND;
|
||||||
|
extern const int SIZES_OF_COLUMNS_DOESNT_MATCH;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ColumnPtr ColumnString::cloneResized(size_t to_size) const
|
||||||
|
{
|
||||||
|
auto res = std::make_shared<ColumnString>();
|
||||||
|
|
||||||
|
if (to_size == 0)
|
||||||
|
return res;
|
||||||
|
|
||||||
|
size_t from_size = size();
|
||||||
|
|
||||||
|
if (to_size <= from_size)
|
||||||
|
{
|
||||||
|
/// Just cut column.
|
||||||
|
|
||||||
|
res->offsets.assign(offsets.begin(), offsets.begin() + to_size);
|
||||||
|
res->chars.assign(chars.begin(), chars.begin() + offsets[to_size - 1]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/// Copy column and append empty strings for extra elements.
|
||||||
|
|
||||||
|
Offset_t offset = 0;
|
||||||
|
if (from_size > 0)
|
||||||
|
{
|
||||||
|
res->offsets.assign(offsets.begin(), offsets.end());
|
||||||
|
res->chars.assign(chars.begin(), chars.end());
|
||||||
|
offset = offsets.back();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Empty strings are just zero terminating bytes.
|
||||||
|
|
||||||
|
res->chars.resize_fill(res->chars.size() + to_size - from_size);
|
||||||
|
|
||||||
|
res->offsets.resize(to_size);
|
||||||
|
for (size_t i = from_size; i < to_size; ++i)
|
||||||
|
{
|
||||||
|
++offset;
|
||||||
|
res->offsets[i] = offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ColumnString::insertRangeFrom(const IColumn & src, size_t start, size_t length)
|
||||||
|
{
|
||||||
|
if (length == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const ColumnString & src_concrete = static_cast<const ColumnString &>(src);
|
||||||
|
|
||||||
|
if (start + length > src_concrete.offsets.size())
|
||||||
|
throw Exception("Parameter out of bound in IColumnString::insertRangeFrom method.",
|
||||||
|
ErrorCodes::PARAMETER_OUT_OF_BOUND);
|
||||||
|
|
||||||
|
size_t nested_offset = src_concrete.offsetAt(start);
|
||||||
|
size_t nested_length = src_concrete.offsets[start + length - 1] - nested_offset;
|
||||||
|
|
||||||
|
size_t old_chars_size = chars.size();
|
||||||
|
chars.resize(old_chars_size + nested_length);
|
||||||
|
memcpy(&chars[old_chars_size], &src_concrete.chars[nested_offset], nested_length);
|
||||||
|
|
||||||
|
if (start == 0 && offsets.empty())
|
||||||
|
{
|
||||||
|
offsets.assign(src_concrete.offsets.begin(), src_concrete.offsets.begin() + length);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
size_t old_size = offsets.size();
|
||||||
|
size_t prev_max_offset = old_size ? offsets.back() : 0;
|
||||||
|
offsets.resize(old_size + length);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < length; ++i)
|
||||||
|
offsets[old_size + i] = src_concrete.offsets[start + i] - nested_offset + prev_max_offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ColumnPtr ColumnString::filter(const Filter & filt, ssize_t result_size_hint) const
|
||||||
|
{
|
||||||
|
if (offsets.size() == 0)
|
||||||
|
return std::make_shared<ColumnString>();
|
||||||
|
|
||||||
|
auto res = std::make_shared<ColumnString>();
|
||||||
|
|
||||||
|
Chars_t & res_chars = res->chars;
|
||||||
|
Offsets_t & res_offsets = res->offsets;
|
||||||
|
|
||||||
|
filterArraysImpl<UInt8>(chars, offsets, res_chars, res_offsets, filt, result_size_hint);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ColumnPtr ColumnString::permute(const Permutation & perm, size_t limit) const
|
||||||
|
{
|
||||||
|
size_t size = offsets.size();
|
||||||
|
|
||||||
|
if (limit == 0)
|
||||||
|
limit = size;
|
||||||
|
else
|
||||||
|
limit = std::min(size, limit);
|
||||||
|
|
||||||
|
if (perm.size() < limit)
|
||||||
|
throw Exception("Size of permutation is less than required.", ErrorCodes::SIZES_OF_COLUMNS_DOESNT_MATCH);
|
||||||
|
|
||||||
|
if (limit == 0)
|
||||||
|
return std::make_shared<ColumnString>();
|
||||||
|
|
||||||
|
std::shared_ptr<ColumnString> res = std::make_shared<ColumnString>();
|
||||||
|
|
||||||
|
Chars_t & res_chars = res->chars;
|
||||||
|
Offsets_t & res_offsets = res->offsets;
|
||||||
|
|
||||||
|
if (limit == size)
|
||||||
|
res_chars.resize(chars.size());
|
||||||
|
else
|
||||||
|
{
|
||||||
|
size_t new_chars_size = 0;
|
||||||
|
for (size_t i = 0; i < limit; ++i)
|
||||||
|
new_chars_size += sizeAt(perm[i]);
|
||||||
|
res_chars.resize(new_chars_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
res_offsets.resize(limit);
|
||||||
|
|
||||||
|
Offset_t current_new_offset = 0;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < limit; ++i)
|
||||||
|
{
|
||||||
|
size_t j = perm[i];
|
||||||
|
size_t string_offset = j == 0 ? 0 : offsets[j - 1];
|
||||||
|
size_t string_size = offsets[j] - string_offset;
|
||||||
|
|
||||||
|
memcpySmallAllowReadWriteOverflow15(&res_chars[current_new_offset], &chars[string_offset], string_size);
|
||||||
|
|
||||||
|
current_new_offset += string_size;
|
||||||
|
res_offsets[i] = current_new_offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template <bool positive>
|
||||||
|
struct ColumnString::less
|
||||||
|
{
|
||||||
|
const ColumnString & parent;
|
||||||
|
less(const ColumnString & parent_) : parent(parent_) {}
|
||||||
|
bool operator()(size_t lhs, size_t rhs) const
|
||||||
|
{
|
||||||
|
int res = strcmp(
|
||||||
|
reinterpret_cast<const char *>(&parent.chars[parent.offsetAt(lhs)]),
|
||||||
|
reinterpret_cast<const char *>(&parent.chars[parent.offsetAt(rhs)]));
|
||||||
|
|
||||||
|
return positive ? (res < 0) : (res > 0);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void ColumnString::getPermutation(bool reverse, size_t limit, Permutation & res) const
|
||||||
|
{
|
||||||
|
size_t s = offsets.size();
|
||||||
|
res.resize(s);
|
||||||
|
for (size_t i = 0; i < s; ++i)
|
||||||
|
res[i] = i;
|
||||||
|
|
||||||
|
if (limit >= s)
|
||||||
|
limit = 0;
|
||||||
|
|
||||||
|
if (limit)
|
||||||
|
{
|
||||||
|
if (reverse)
|
||||||
|
std::partial_sort(res.begin(), res.begin() + limit, res.end(), less<false>(*this));
|
||||||
|
else
|
||||||
|
std::partial_sort(res.begin(), res.begin() + limit, res.end(), less<true>(*this));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (reverse)
|
||||||
|
std::sort(res.begin(), res.end(), less<false>(*this));
|
||||||
|
else
|
||||||
|
std::sort(res.begin(), res.end(), less<true>(*this));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ColumnPtr ColumnString::replicate(const Offsets_t & replicate_offsets) const
|
||||||
|
{
|
||||||
|
size_t col_size = size();
|
||||||
|
if (col_size != replicate_offsets.size())
|
||||||
|
throw Exception("Size of offsets doesn't match size of column.", ErrorCodes::SIZES_OF_COLUMNS_DOESNT_MATCH);
|
||||||
|
|
||||||
|
std::shared_ptr<ColumnString> res = std::make_shared<ColumnString>();
|
||||||
|
|
||||||
|
if (0 == col_size)
|
||||||
|
return res;
|
||||||
|
|
||||||
|
Chars_t & res_chars = res->chars;
|
||||||
|
Offsets_t & res_offsets = res->offsets;
|
||||||
|
res_chars.reserve(chars.size() / col_size * replicate_offsets.back());
|
||||||
|
res_offsets.reserve(replicate_offsets.back());
|
||||||
|
|
||||||
|
Offset_t prev_replicate_offset = 0;
|
||||||
|
Offset_t prev_string_offset = 0;
|
||||||
|
Offset_t current_new_offset = 0;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < col_size; ++i)
|
||||||
|
{
|
||||||
|
size_t size_to_replicate = replicate_offsets[i] - prev_replicate_offset;
|
||||||
|
size_t string_size = offsets[i] - prev_string_offset;
|
||||||
|
|
||||||
|
for (size_t j = 0; j < size_to_replicate; ++j)
|
||||||
|
{
|
||||||
|
current_new_offset += string_size;
|
||||||
|
res_offsets.push_back(current_new_offset);
|
||||||
|
|
||||||
|
res_chars.resize(res_chars.size() + string_size);
|
||||||
|
memcpySmallAllowReadWriteOverflow15(
|
||||||
|
&res_chars[res_chars.size() - string_size], &chars[prev_string_offset], string_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
prev_replicate_offset = replicate_offsets[i];
|
||||||
|
prev_string_offset = offsets[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ColumnString::reserve(size_t n)
|
||||||
|
{
|
||||||
|
offsets.reserve(n);
|
||||||
|
chars.reserve(n * DBMS_APPROX_STRING_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ColumnString::getExtremes(Field & min, Field & max) const
|
||||||
|
{
|
||||||
|
min = String();
|
||||||
|
max = String();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int ColumnString::compareAtWithCollation(size_t n, size_t m, const IColumn & rhs_, const Collator & collator) const
|
int ColumnString::compareAtWithCollation(size_t n, size_t m, const IColumn & rhs_, const Collator & collator) const
|
||||||
{
|
{
|
||||||
const ColumnString & rhs = static_cast<const ColumnString &>(rhs_);
|
const ColumnString & rhs = static_cast<const ColumnString &>(rhs_);
|
||||||
@ -16,7 +268,7 @@ int ColumnString::compareAtWithCollation(size_t n, size_t m, const IColumn & rhs
|
|||||||
|
|
||||||
|
|
||||||
template <bool positive>
|
template <bool positive>
|
||||||
struct lessWithCollation
|
struct ColumnString::lessWithCollation
|
||||||
{
|
{
|
||||||
const ColumnString & parent;
|
const ColumnString & parent;
|
||||||
const Collator & collator;
|
const Collator & collator;
|
||||||
@ -33,7 +285,6 @@ struct lessWithCollation
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
void ColumnString::getPermutationWithCollation(const Collator & collator, bool reverse, size_t limit, Permutation & res) const
|
void ColumnString::getPermutationWithCollation(const Collator & collator, bool reverse, size_t limit, Permutation & res) const
|
||||||
{
|
{
|
||||||
size_t s = offsets.size();
|
size_t s = offsets.size();
|
||||||
|
@ -1068,7 +1068,6 @@ DataTypePtr FunctionArrayElement::getReturnTypeImpl(const DataTypes & arguments)
|
|||||||
return array_type->getNestedType();
|
return array_type->getNestedType();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void FunctionArrayElement::executeImpl(Block & block, const ColumnNumbers & arguments, size_t result)
|
void FunctionArrayElement::executeImpl(Block & block, const ColumnNumbers & arguments, size_t result)
|
||||||
{
|
{
|
||||||
/// Check nullability.
|
/// Check nullability.
|
||||||
@ -1599,7 +1598,6 @@ FunctionPtr FunctionArrayEnumerateUniq::create(const Context & context)
|
|||||||
return std::make_shared<FunctionArrayEnumerateUniq>();
|
return std::make_shared<FunctionArrayEnumerateUniq>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Получить имя функции.
|
|
||||||
String FunctionArrayEnumerateUniq::getName() const
|
String FunctionArrayEnumerateUniq::getName() const
|
||||||
{
|
{
|
||||||
return name;
|
return name;
|
||||||
|
@ -184,7 +184,6 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// Получить имя функции.
|
|
||||||
String getName() const override
|
String getName() const override
|
||||||
{
|
{
|
||||||
return Name::get();
|
return Name::get();
|
||||||
@ -213,7 +212,6 @@ public:
|
|||||||
return std::make_shared<DataTypeUInt8>();
|
return std::make_shared<DataTypeUInt8>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Выполнить функцию над блоком.
|
|
||||||
void execute(Block & block, const ColumnNumbers & arguments, size_t result)
|
void execute(Block & block, const ColumnNumbers & arguments, size_t result)
|
||||||
{
|
{
|
||||||
//Stopwatch sw;
|
//Stopwatch sw;
|
||||||
|
@ -98,6 +98,7 @@ StorageDistributed::StorageDistributed(
|
|||||||
createDirectoryMonitors();
|
createDirectoryMonitors();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
StorageDistributed::StorageDistributed(
|
StorageDistributed::StorageDistributed(
|
||||||
const std::string & name_,
|
const std::string & name_,
|
||||||
NamesAndTypesListPtr columns_,
|
NamesAndTypesListPtr columns_,
|
||||||
@ -121,6 +122,7 @@ StorageDistributed::StorageDistributed(
|
|||||||
createDirectoryMonitors();
|
createDirectoryMonitors();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
StoragePtr StorageDistributed::create(
|
StoragePtr StorageDistributed::create(
|
||||||
const std::string & name_,
|
const std::string & name_,
|
||||||
NamesAndTypesListPtr columns_,
|
NamesAndTypesListPtr columns_,
|
||||||
@ -162,6 +164,7 @@ StoragePtr StorageDistributed::create(
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
BlockInputStreams StorageDistributed::read(
|
BlockInputStreams StorageDistributed::read(
|
||||||
const Names & column_names,
|
const Names & column_names,
|
||||||
ASTPtr query,
|
ASTPtr query,
|
||||||
@ -203,6 +206,7 @@ BlockInputStreams StorageDistributed::read(
|
|||||||
context, settings, enable_shard_multiplexing}.execute();
|
context, settings, enable_shard_multiplexing}.execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
BlockOutputStreamPtr StorageDistributed::write(ASTPtr query, const Settings & settings)
|
BlockOutputStreamPtr StorageDistributed::write(ASTPtr query, const Settings & settings)
|
||||||
{
|
{
|
||||||
auto cluster = context.getCluster(cluster_name);
|
auto cluster = context.getCluster(cluster_name);
|
||||||
@ -214,14 +218,14 @@ BlockOutputStreamPtr StorageDistributed::write(ASTPtr query, const Settings & se
|
|||||||
throw Exception{
|
throw Exception{
|
||||||
"Method write is not supported by storage " + getName() +
|
"Method write is not supported by storage " + getName() +
|
||||||
" with more than one shard and no sharding key provided",
|
" with more than one shard and no sharding key provided",
|
||||||
ErrorCodes::STORAGE_REQUIRES_PARAMETER
|
ErrorCodes::STORAGE_REQUIRES_PARAMETER};
|
||||||
};
|
|
||||||
|
|
||||||
/// DistributedBlockOutputStream will not own cluster, but will own ConnectionPools of the cluster
|
/// DistributedBlockOutputStream will not own cluster, but will own ConnectionPools of the cluster
|
||||||
return std::make_shared<DistributedBlockOutputStream>(
|
return std::make_shared<DistributedBlockOutputStream>(
|
||||||
*this, rewriteInsertQuery(query, remote_database, remote_table), cluster);
|
*this, rewriteInsertQuery(query, remote_database, remote_table), cluster);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void StorageDistributed::alter(const AlterCommands & params, const String & database_name, const String & table_name, const Context & context)
|
void StorageDistributed::alter(const AlterCommands & params, const String & database_name, const String & table_name, const Context & context)
|
||||||
{
|
{
|
||||||
for (const auto & param : params)
|
for (const auto & param : params)
|
||||||
@ -236,11 +240,13 @@ void StorageDistributed::alter(const AlterCommands & params, const String & data
|
|||||||
*columns, materialized_columns, alias_columns, column_defaults, {});
|
*columns, materialized_columns, alias_columns, column_defaults, {});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void StorageDistributed::shutdown()
|
void StorageDistributed::shutdown()
|
||||||
{
|
{
|
||||||
directory_monitors.clear();
|
directory_monitors.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void StorageDistributed::reshardPartitions(ASTPtr query, const String & database_name,
|
void StorageDistributed::reshardPartitions(ASTPtr query, const String & database_name,
|
||||||
const Field & first_partition, const Field & last_partition,
|
const Field & first_partition, const Field & last_partition,
|
||||||
const WeightedZooKeeperPaths & weighted_zookeeper_paths,
|
const WeightedZooKeeperPaths & weighted_zookeeper_paths,
|
||||||
@ -383,6 +389,7 @@ void StorageDistributed::reshardPartitions(ASTPtr query, const String & database
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
BlockInputStreams StorageDistributed::describe(const Context & context, const Settings & settings)
|
BlockInputStreams StorageDistributed::describe(const Context & context, const Settings & settings)
|
||||||
{
|
{
|
||||||
/// Создать запрос DESCRIBE TABLE.
|
/// Создать запрос DESCRIBE TABLE.
|
||||||
@ -406,6 +413,7 @@ BlockInputStreams StorageDistributed::describe(const Context & context, const Se
|
|||||||
context, settings, enable_shard_multiplexing}.execute();
|
context, settings, enable_shard_multiplexing}.execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NameAndTypePair StorageDistributed::getColumn(const String & column_name) const
|
NameAndTypePair StorageDistributed::getColumn(const String & column_name) const
|
||||||
{
|
{
|
||||||
if (const auto & type = VirtualColumnFactory::tryGetType(column_name))
|
if (const auto & type = VirtualColumnFactory::tryGetType(column_name))
|
||||||
@ -414,16 +422,19 @@ NameAndTypePair StorageDistributed::getColumn(const String & column_name) const
|
|||||||
return getRealColumn(column_name);
|
return getRealColumn(column_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool StorageDistributed::hasColumn(const String & column_name) const
|
bool StorageDistributed::hasColumn(const String & column_name) const
|
||||||
{
|
{
|
||||||
return VirtualColumnFactory::hasColumn(column_name) || IStorage::hasColumn(column_name);
|
return VirtualColumnFactory::hasColumn(column_name) || IStorage::hasColumn(column_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void StorageDistributed::createDirectoryMonitor(const std::string & name)
|
void StorageDistributed::createDirectoryMonitor(const std::string & name)
|
||||||
{
|
{
|
||||||
directory_monitors.emplace(name, std::make_unique<StorageDistributedDirectoryMonitor>(*this, name));
|
directory_monitors.emplace(name, std::make_unique<StorageDistributedDirectoryMonitor>(*this, name));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void StorageDistributed::createDirectoryMonitors()
|
void StorageDistributed::createDirectoryMonitors()
|
||||||
{
|
{
|
||||||
if (path.empty())
|
if (path.empty())
|
||||||
@ -437,6 +448,7 @@ void StorageDistributed::createDirectoryMonitors()
|
|||||||
createDirectoryMonitor(it.name());
|
createDirectoryMonitor(it.name());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void StorageDistributed::requireDirectoryMonitor(const std::string & name)
|
void StorageDistributed::requireDirectoryMonitor(const std::string & name)
|
||||||
{
|
{
|
||||||
if (!directory_monitors.count(name))
|
if (!directory_monitors.count(name))
|
||||||
@ -448,6 +460,7 @@ size_t StorageDistributed::getShardCount() const
|
|||||||
return getCluster()->getRemoteShardCount();
|
return getCluster()->getRemoteShardCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ClusterPtr StorageDistributed::getCluster() const
|
ClusterPtr StorageDistributed::getCluster() const
|
||||||
{
|
{
|
||||||
return (owned_cluster) ? owned_cluster : context.getCluster(cluster_name);
|
return (owned_cluster) ? owned_cluster : context.getCluster(cluster_name);
|
||||||
|
Loading…
Reference in New Issue
Block a user