mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 15:12:02 +00:00
Function multiIf constant result support
This commit is contained in:
parent
77af612bc5
commit
dac6cceac1
@ -134,7 +134,9 @@ public:
|
||||
Instruction instruction;
|
||||
size_t source_idx = i + 1;
|
||||
|
||||
if (source_idx == args.size())
|
||||
bool last_else_branch = source_idx == args.size();
|
||||
|
||||
if (last_else_branch)
|
||||
{
|
||||
/// The last, "else" branch can be treated as a branch with always true condition "else if (true)".
|
||||
--source_idx;
|
||||
@ -150,13 +152,15 @@ public:
|
||||
if (cond_col.column->onlyNull())
|
||||
continue;
|
||||
|
||||
if (isColumnConst(*cond_col.column))
|
||||
if (const auto * column_const = checkAndGetColumn<ColumnConst>(*cond_col.column))
|
||||
{
|
||||
Field value = typeid_cast<const ColumnConst &>(*cond_col.column).getField();
|
||||
Field value = column_const->getField();
|
||||
|
||||
if (value.isNull())
|
||||
continue;
|
||||
if (value.get<UInt64>() == 0)
|
||||
continue;
|
||||
|
||||
instruction.condition_always_true = true;
|
||||
}
|
||||
else
|
||||
@ -189,9 +193,19 @@ public:
|
||||
break;
|
||||
}
|
||||
|
||||
size_t rows = input_rows_count;
|
||||
MutableColumnPtr res = return_type->createColumn();
|
||||
|
||||
/// Special case if first instruction condition is always true and source is constant
|
||||
if (instructions.size() == 1 && instructions.front().source_is_constant
|
||||
&& instructions.front().condition_always_true)
|
||||
{
|
||||
auto & instruction = instructions.front();
|
||||
res->insertFrom(assert_cast<const ColumnConst &>(*instruction.source).getDataColumn(), 0);
|
||||
return ColumnConst::create(std::move(res), instruction.source->size());
|
||||
}
|
||||
|
||||
size_t rows = input_rows_count;
|
||||
|
||||
for (size_t i = 0; i < rows; ++i)
|
||||
{
|
||||
for (const auto & instruction : instructions)
|
||||
|
@ -18662,3 +18662,7 @@ Miscellaneous
|
||||
1 Москва
|
||||
65 Москва
|
||||
208 Москва
|
||||
Constant result
|
||||
Value 1
|
||||
Value 1
|
||||
ValueFirst 0
|
||||
|
@ -1938,3 +1938,14 @@ INSERT INTO multi_if_check(col1) VALUES (10418),(235),(25),(179),(26030),(28381)
|
||||
|
||||
SELECT DISTINCT col1, multiIf(col1 != 213, 'Москва', 'Мир') AS k FROM multi_if_check LIMIT 10;
|
||||
DROP TABLE IF EXISTS multi_if_check;
|
||||
|
||||
SELECT 'Constant result';
|
||||
|
||||
CREATE TABLE multi_if_check(value String) ENGINE=TinyLog;
|
||||
INSERT INTO multi_if_check VALUES ('1');
|
||||
|
||||
SELECT multiIf(2 > 1, 'Value', 'ElseValue') as a, isConstant(a) FROM multi_if_check;
|
||||
SELECT multiIf(2 > 1, 'Value', value) as a, isConstant(a) FROM multi_if_check;
|
||||
SELECT multiIf(value == '1', 'ValueFirst', 2 > 1, 'ValueSecond', 'ElseValue') as a, isConstant(a) FROM multi_if_check;
|
||||
|
||||
DROP TABLE IF EXISTS multi_if_check;
|
||||
|
Loading…
Reference in New Issue
Block a user