mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-11 17:02:25 +00:00
dbms: additions [#METR-15987].
This commit is contained in:
parent
1cf67bdede
commit
8d09c7f618
@ -729,27 +729,33 @@ private:
|
|||||||
|
|
||||||
if (arguments.size() == 4)
|
if (arguments.size() == 4)
|
||||||
{
|
{
|
||||||
const IColumnConst * default_col = dynamic_cast<const IColumnConst *>(&*block.getByPosition(arguments[3]).column);
|
const IColumn * default_col = block.getByPosition(arguments[3]).column.get();
|
||||||
|
const IColumnConst * const_default_col = dynamic_cast<const IColumnConst *>(default_col);
|
||||||
|
|
||||||
if (default_col)
|
if (const_default_col)
|
||||||
|
const_default_value = (*const_default_col)[0];
|
||||||
|
|
||||||
|
/// Нужно ли преобразовать элементы to и default_value к наименьшему общему типу, который является Float64?
|
||||||
|
bool default_col_is_float =
|
||||||
|
typeid_cast<const ColumnFloat32 *>(default_col)
|
||||||
|
|| typeid_cast<const ColumnFloat64 *>(default_col)
|
||||||
|
|| typeid_cast<const ColumnConstFloat32 *>(default_col)
|
||||||
|
|| typeid_cast<const ColumnConstFloat64 *>(default_col);
|
||||||
|
|
||||||
|
bool to_is_float = to[0].getType() == Field::Types::Float64;
|
||||||
|
|
||||||
|
if (default_col_is_float && !to_is_float)
|
||||||
{
|
{
|
||||||
const_default_value = (*default_col)[0];
|
converted_to.resize(to.size());
|
||||||
|
for (size_t i = 0, size = to.size(); i < size; ++i)
|
||||||
/// Нужно ли преобразовать элементы to и default_value к наименьшему общему типу, который является Float64?
|
converted_to[i] = apply_visitor(FieldVisitorConvertToNumber<Float64>(), to[i]);
|
||||||
if (const_default_value.getType() == Field::Types::Float64 && to[0].getType() != Field::Types::Float64)
|
used_to = &converted_to;
|
||||||
{
|
}
|
||||||
converted_to.resize(to.size());
|
else if (!default_col_is_float && to_is_float)
|
||||||
for (size_t i = 0, size = to.size(); i < size; ++i)
|
{
|
||||||
converted_to[i] = apply_visitor(FieldVisitorConvertToNumber<Float64>(), to[i]);
|
if (const_default_col)
|
||||||
used_to = &converted_to;
|
const_default_value = apply_visitor(FieldVisitorConvertToNumber<Float64>(), const_default_value);
|
||||||
}
|
|
||||||
else if (const_default_value.getType() != Field::Types::Float64 && to[0].getType() == Field::Types::Float64)
|
|
||||||
{
|
|
||||||
const_default_value = apply_visitor(FieldVisitorConvertToNumber<Float64>(), const_default_value);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// TODO Преобразование для to в случае неконстантного default
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Замечание: не делается проверка дубликатов в массиве from.
|
/// Замечание: не делается проверка дубликатов в массиве from.
|
||||||
|
@ -0,0 +1,84 @@
|
|||||||
|
9999
|
||||||
|
9999
|
||||||
|
9999
|
||||||
|
111
|
||||||
|
9999
|
||||||
|
222
|
||||||
|
9999
|
||||||
|
333
|
||||||
|
9999
|
||||||
|
9999
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
hello
|
||||||
|
|
||||||
|
world
|
||||||
|
|
||||||
|
abc
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
hello
|
||||||
|
|
||||||
|
world
|
||||||
|
|
||||||
|
abc
|
||||||
|
|
||||||
|
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-
|
||||||
|
hello
|
||||||
|
-
|
||||||
|
world
|
||||||
|
-
|
||||||
|
abc
|
||||||
|
-
|
||||||
|
-
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
111
|
||||||
|
0
|
||||||
|
222
|
||||||
|
0
|
||||||
|
333
|
||||||
|
0
|
||||||
|
0
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
111
|
||||||
|
-1
|
||||||
|
222
|
||||||
|
-1
|
||||||
|
333
|
||||||
|
-1
|
||||||
|
-1
|
||||||
|
-1.1
|
||||||
|
-1.1
|
||||||
|
-1.1
|
||||||
|
111
|
||||||
|
-1.1
|
||||||
|
222
|
||||||
|
-1.1
|
||||||
|
333
|
||||||
|
-1.1
|
||||||
|
-1.1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
111
|
||||||
|
1
|
||||||
|
222.2
|
||||||
|
1
|
||||||
|
333
|
||||||
|
1
|
||||||
|
1
|
||||||
|
Остальные
|
||||||
|
Яндекс
|
||||||
|
Google
|
||||||
|
Остальные
|
@ -0,0 +1,12 @@
|
|||||||
|
SELECT transform(number, [3, 5, 7], [111, 222, 333], materialize(9999)) FROM system.numbers LIMIT 10;
|
||||||
|
SELECT transform(number, [3, 5, 7], ['hello', 'world', 'abc'], materialize('')) FROM system.numbers LIMIT 10;
|
||||||
|
SELECT transform(toString(number), ['3', '5', '7'], ['hello', 'world', 'abc'], materialize('')) FROM system.numbers LIMIT 10;
|
||||||
|
SELECT transform(toString(number), ['3', '5', '7'], ['hello', 'world', 'abc'], materialize('-')) FROM system.numbers LIMIT 10;
|
||||||
|
SELECT transform(toString(number), ['3', '5', '7'], [111, 222, 333], materialize(0)) FROM system.numbers LIMIT 10;
|
||||||
|
SELECT transform(toString(number), ['3', '5', '7'], [111, 222, 333], materialize(-1)) FROM system.numbers LIMIT 10;
|
||||||
|
SELECT transform(toString(number), ['3', '5', '7'], [111, 222, 333], materialize(-1.1)) FROM system.numbers LIMIT 10;
|
||||||
|
SELECT transform(toString(number), ['3', '5', '7'], [111, 222.2, 333], materialize(1)) FROM system.numbers LIMIT 10;
|
||||||
|
SELECT transform(1, [2, 3], ['Яндекс', 'Google'], materialize('Остальные')) AS title;
|
||||||
|
SELECT transform(2, [2, 3], ['Яндекс', 'Google'], materialize('Остальные')) AS title;
|
||||||
|
SELECT transform(3, [2, 3], ['Яндекс', 'Google'], materialize('Остальные')) AS title;
|
||||||
|
SELECT transform(4, [2, 3], ['Яндекс', 'Google'], materialize('Остальные')) AS title;
|
Loading…
Reference in New Issue
Block a user