Fixed tests

This commit is contained in:
Maksim Kita 2022-10-20 13:45:32 +02:00
parent 8ac7f4423b
commit 3862dd96fe
2 changed files with 32 additions and 5 deletions

View File

@ -53,9 +53,31 @@ IQueryTreeNode::IQueryTreeNode(size_t children_size)
children.resize(children_size);
}
namespace
{
using NodePair = std::pair<const IQueryTreeNode *, const IQueryTreeNode *>;
struct NodePairHash
{
size_t operator()(const NodePair & node_pair) const
{
auto hash = std::hash<const IQueryTreeNode *>();
size_t result = 0;
boost::hash_combine(result, hash(node_pair.first));
boost::hash_combine(result, hash(node_pair.second));
return result;
}
};
}
bool IQueryTreeNode::isEqual(const IQueryTreeNode & rhs) const
{
std::vector<std::pair<const IQueryTreeNode *, const IQueryTreeNode *>> nodes_to_process;
std::vector<NodePair> nodes_to_process;
std::unordered_set<NodePair, NodePairHash> equals_pairs;
nodes_to_process.emplace_back(this, &rhs);
@ -67,6 +89,9 @@ bool IQueryTreeNode::isEqual(const IQueryTreeNode & rhs) const
const auto * lhs_node_to_compare = nodes_to_compare.first;
const auto * rhs_node_to_compare = nodes_to_compare.second;
if (equals_pairs.contains(std::make_pair(lhs_node_to_compare, rhs_node_to_compare)))
continue;
assert(lhs_node_to_compare);
assert(rhs_node_to_compare);
@ -121,6 +146,8 @@ bool IQueryTreeNode::isEqual(const IQueryTreeNode & rhs) const
nodes_to_process.emplace_back(lhs_strong_pointer.get(), rhs_strong_pointer.get());
}
equals_pairs.emplace(lhs_node_to_compare, rhs_node_to_compare);
}
return true;

View File

@ -208,7 +208,7 @@ std::optional<AggregationAnalysisResult> analyzeAggregation(QueryTreeNodePtr & q
return aggregation_analysis_result;
}
/** Construct aggregation analysis result if query tree has window functions.
/** Construct window analysis result if query tree has window functions.
* Actions before window functions are added into actions chain, if result is not null optional.
*/
std::optional<WindowAnalysisResult> analyzeWindow(QueryTreeNodePtr & query_tree,
@ -323,8 +323,8 @@ ProjectionAnalysisResult analyzeProjection(const QueryNode & query_node,
if (projection_columns_size != projection_outputs_size)
throw Exception(ErrorCodes::LOGICAL_ERROR,
"QueryTree projection nodes size mismatch. Expected {}. Actual {}",
projection_outputs_size,
projection_columns_size);
projection_columns_size,
projection_outputs_size);
for (size_t i = 0; i < projection_outputs_size; ++i)
{
@ -487,7 +487,7 @@ PlannerExpressionsAnalysisResult buildExpressionAnalysisResult(QueryTreeNodePtr
if (having_action_step_index_optional && having_analysis_result_optional)
{
auto & having_analysis_result = *where_analysis_result_optional;
auto & having_analysis_result = *having_analysis_result_optional;
auto & having_actions_chain_node = actions_chain.at(*having_action_step_index_optional);
having_analysis_result.remove_filter_column = !having_actions_chain_node->getChildRequiredOutputColumnsNames().contains(having_analysis_result.filter_column_name);
expressions_analysis_result.addHaving(std::move(having_analysis_result));