mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-25 11:10:49 +00:00
Fix bug
This commit is contained in:
parent
0a32e47b5f
commit
bd415b17d2
@ -16,7 +16,7 @@ extern const int LOGICAL_ERROR;
|
||||
extern const int ILLEGAL_TYPE_OF_ARGUMENT;
|
||||
}
|
||||
|
||||
ColumnPtr expandColumnByMask(const ColumnPtr & column, const PaddedPODArray<UInt8>& mask, Field * field, bool reverse)
|
||||
void expandColumnByMask(ColumnPtr & column, const PaddedPODArray<UInt8>& mask, Field * field, bool reverse)
|
||||
{
|
||||
MutableColumnPtr res = column->cloneEmpty();
|
||||
res->reserve(mask.size());
|
||||
@ -39,8 +39,7 @@ ColumnPtr expandColumnByMask(const ColumnPtr & column, const PaddedPODArray<UInt
|
||||
|
||||
if (index < column->size())
|
||||
throw Exception("Too less bits in mask", ErrorCodes::LOGICAL_ERROR);
|
||||
|
||||
return res;
|
||||
column = std::move(res);
|
||||
}
|
||||
|
||||
template <typename ValueType>
|
||||
@ -134,7 +133,7 @@ void maskedExecute(ColumnWithTypeAndName & column, const PaddedPODArray<UInt8> &
|
||||
|
||||
auto filtered = column_function->filter(mask, -1, reverse);
|
||||
auto result = typeid_cast<const ColumnFunction *>(filtered.get())->reduce(true);
|
||||
result.column = expandColumnByMask(result.column, mask, default_value, reverse);
|
||||
expandColumnByMask(result.column, mask, default_value, reverse);
|
||||
column = std::move(result);
|
||||
}
|
||||
|
||||
|
@ -114,7 +114,7 @@ public:
|
||||
IColumn::Filter current_mask;
|
||||
IColumn::Filter mask_disjunctions = IColumn::Filter(arguments[0].column->size(), 0);
|
||||
|
||||
auto default_value = std::make_unique<Field>(1);
|
||||
auto default_value = std::make_unique<Field>(0);
|
||||
size_t i = 1;
|
||||
while (i < arguments.size())
|
||||
{
|
||||
|
@ -348,6 +348,8 @@ static void executeAction(const ExpressionActions::Action & action, ExecutionCon
|
||||
{
|
||||
case ActionsDAG::ActionType::FUNCTION:
|
||||
{
|
||||
// LOG_DEBUG(&Poco::Logger::get("ExpressionActions"), "Execute action FUNCTION: {}", action.node->function_base->getName());
|
||||
|
||||
auto & res_column = columns[action.result_position];
|
||||
if (res_column.type || res_column.column)
|
||||
throw Exception("Result column is not empty", ErrorCodes::LOGICAL_ERROR);
|
||||
@ -379,13 +381,21 @@ static void executeAction(const ExpressionActions::Action & action, ExecutionCon
|
||||
ProfileEvents::increment(ProfileEvents::CompiledFunctionExecute);
|
||||
|
||||
if (action.node->function_base->isShortCircuit() && use_short_circuit_function_evaluation)
|
||||
{
|
||||
// LOG_DEBUG(&Poco::Logger::get("ExpressionActions"), "Execute Short Circuit Arguments");
|
||||
action.node->function_base->executeShortCircuitArguments(arguments);
|
||||
}
|
||||
|
||||
// LOG_DEBUG(&Poco::Logger::get("ExpressionActions"), "Execute function");
|
||||
|
||||
res_column.column = action.node->function->execute(arguments, res_column.type, num_rows, dry_run);
|
||||
break;
|
||||
}
|
||||
|
||||
case ActionsDAG::ActionType::COLUMN_FUNCTION:
|
||||
{
|
||||
// LOG_DEBUG(&Poco::Logger::get("ExpressionActions"), "Execute action COLUMN FUNCTION: {}", action.node->function_base->getName());
|
||||
|
||||
auto & res_column = columns[action.result_position];
|
||||
if (res_column.type || res_column.column)
|
||||
throw Exception("Result column is not empty", ErrorCodes::LOGICAL_ERROR);
|
||||
@ -402,7 +412,18 @@ static void executeAction(const ExpressionActions::Action & action, ExecutionCon
|
||||
arguments[i] = columns[action.arguments[i].pos];
|
||||
}
|
||||
|
||||
res_column.column = ColumnFunction::create(num_rows, action.node->function_base, std::move(arguments));
|
||||
if (use_short_circuit_function_evaluation)
|
||||
res_column.column = ColumnFunction::create(num_rows, action.node->function_base, std::move(arguments));
|
||||
else
|
||||
{
|
||||
// LOG_DEBUG(&Poco::Logger::get("ExpressionActions"), "Execute function");
|
||||
|
||||
ProfileEvents::increment(ProfileEvents::FunctionExecute);
|
||||
if (action.node->is_function_compiled)
|
||||
ProfileEvents::increment(ProfileEvents::CompiledFunctionExecute);
|
||||
res_column.column = action.node->function->execute(arguments, res_column.type, num_rows, dry_run);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@ -441,6 +462,8 @@ static void executeAction(const ExpressionActions::Action & action, ExecutionCon
|
||||
|
||||
case ActionsDAG::ActionType::COLUMN:
|
||||
{
|
||||
// LOG_DEBUG(&Poco::Logger::get("ExpressionActions"), "Execute action COLUMN: {}", action.node->result_name);
|
||||
|
||||
auto & res_column = columns[action.result_position];
|
||||
res_column.column = action.node->column->cloneResized(num_rows);
|
||||
res_column.type = action.node->result_type;
|
||||
@ -450,6 +473,8 @@ static void executeAction(const ExpressionActions::Action & action, ExecutionCon
|
||||
|
||||
case ActionsDAG::ActionType::ALIAS:
|
||||
{
|
||||
// LOG_DEBUG(&Poco::Logger::get("ExpressionActions"), "Execute action ALIAS: {}", action.node->result_name);
|
||||
|
||||
const auto & arg = action.arguments.front();
|
||||
if (action.result_position != arg.pos)
|
||||
{
|
||||
@ -475,6 +500,8 @@ static void executeAction(const ExpressionActions::Action & action, ExecutionCon
|
||||
|
||||
case ActionsDAG::ActionType::INPUT:
|
||||
{
|
||||
// LOG_DEBUG(&Poco::Logger::get("ExpressionActions"), "Execute action INPUT: {}", action.node->result_name);
|
||||
|
||||
auto pos = execution_context.inputs_pos[action.arguments.front().pos];
|
||||
if (pos < 0)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user