ExpressionJIT fix short-circuit with alias

This commit is contained in:
Maksim Kita 2021-09-30 19:23:15 +03:00
parent 3796ccb912
commit d538871d56

View File

@ -324,6 +324,16 @@ static bool isCompilableConstant(const ActionsDAG::Node & node)
return node.column && isColumnConst(*node.column) && canBeNativeType(*node.result_type);
}
static const ActionsDAG::Node * removeAliasIfNeccessasry(const ActionsDAG::Node * node)
{
const ActionsDAG::Node * node_no_alias = node;
while (node_no_alias->type == ActionsDAG::ActionType::ALIAS)
node_no_alias = node_no_alias->children[0];
return node_no_alias;
}
static bool isCompilableFunction(const ActionsDAG::Node & node, const std::unordered_set<const ActionsDAG::Node *> & lazy_executed_nodes)
{
if (node.type != ActionsDAG::ActionType::FUNCTION)
@ -336,7 +346,9 @@ static bool isCompilableFunction(const ActionsDAG::Node & node, const std::unord
{
for (const auto & child : node.children)
{
if (lazy_executed_nodes.contains(child))
const ActionsDAG::Node * child_no_alias = removeAliasIfNeccessasry(child);
if (lazy_executed_nodes.contains(child_no_alias))
return false;
}
}