Fix some tests.

This commit is contained in:
Nikolai Kochetov 2021-03-09 19:54:06 +03:00
parent a669f7d641
commit 4d697c27e4
3 changed files with 41 additions and 7 deletions

View File

@ -292,6 +292,33 @@ std::string ActionsDAG::dumpNames() const
return out.str(); return out.str();
} }
void ActionsDAG::removeUnusedActions(const NameSet & required_names)
{
NodeRawConstPtrs required_nodes;
required_nodes.reserve(required_names.size());
NameSet added;
for (const auto & node : index)
{
if (required_names.count(node->result_name) && added.count(node->result_name) == 0)
{
required_nodes.push_back(node);
added.insert(node->result_name);
}
}
if (added.size() < required_names.size())
{
for (const auto & name : required_names)
if (added.count(name) == 0)
throw Exception(ErrorCodes::UNKNOWN_IDENTIFIER,
"Unknown column: {}, there are only columns {}", name, dumpNames());
}
index.swap(required_nodes);
removeUnusedActions();
}
void ActionsDAG::removeUnusedActions(const Names & required_names) void ActionsDAG::removeUnusedActions(const Names & required_names)
{ {
NodeRawConstPtrs required_nodes; NodeRawConstPtrs required_nodes;
@ -717,18 +744,21 @@ bool ActionsDAG::trivial() const
} }
void ActionsDAG::addMaterializingOutputActions() void ActionsDAG::addMaterializingOutputActions()
{
for (auto & node : index)
node = &materializeNode(*node);
}
const ActionsDAG::Node & ActionsDAG::materializeNode(const Node & node)
{ {
FunctionOverloadResolverPtr func_builder_materialize = FunctionOverloadResolverPtr func_builder_materialize =
std::make_shared<FunctionOverloadResolverAdaptor>( std::make_shared<FunctionOverloadResolverAdaptor>(
std::make_unique<DefaultOverloadResolver>( std::make_unique<DefaultOverloadResolver>(
std::make_shared<FunctionMaterialize>())); std::make_shared<FunctionMaterialize>()));
for (auto & node : index) const auto & name = node.result_name;
{ const auto * func = &addFunction(func_builder_materialize, {&node}, {});
auto & name = node->result_name; return addAlias(*func, name);
node = &addFunction(func_builder_materialize, {node}, {});
node = &addAlias(*node, name);
}
} }
ActionsDAGPtr ActionsDAG::makeConvertingActions( ActionsDAGPtr ActionsDAG::makeConvertingActions(

View File

@ -233,6 +233,7 @@ public:
bool projectedOutput() const { return projected_output; } bool projectedOutput() const { return projected_output; }
void removeUnusedActions(const Names & required_names); void removeUnusedActions(const Names & required_names);
void removeUnusedActions(const NameSet & required_names);
bool hasArrayJoin() const; bool hasArrayJoin() const;
bool hasStatefulFunctions() const; bool hasStatefulFunctions() const;
@ -258,6 +259,8 @@ public:
/// Also add aliases so the result names remain unchanged. /// Also add aliases so the result names remain unchanged.
void addMaterializingOutputActions(); void addMaterializingOutputActions();
const Node & materializeNode(const Node & node);
enum class MatchColumnsMode enum class MatchColumnsMode
{ {
/// Require same number of columns in source and result. Match columns by corresponding positions, regardless to names. /// Require same number of columns in source and result. Match columns by corresponding positions, regardless to names.

View File

@ -75,7 +75,8 @@ ActionsDAGPtr addMissingDefaults(
* it can be full (or the interpreter may decide that it is constant everywhere). * it can be full (or the interpreter may decide that it is constant everywhere).
*/ */
auto new_column = column.type->createColumnConstWithDefaultValue(0); auto new_column = column.type->createColumnConstWithDefaultValue(0);
index.push_back(&actions->addColumn({std::move(new_column), column.type, column.name})); const auto * col = &actions->addColumn({std::move(new_column), column.type, column.name});
index.push_back(&actions->materializeNode(*col));
} }
/// Computes explicitly specified values by default and materialized columns. /// Computes explicitly specified values by default and materialized columns.