diff --git a/dbms/include/DB/Interpreters/LogicalExpressionsOptimizer.h b/dbms/include/DB/Interpreters/LogicalExpressionsOptimizer.h index ed01c5be3d4..e147acc2a41 100644 --- a/dbms/include/DB/Interpreters/LogicalExpressionsOptimizer.h +++ b/dbms/include/DB/Interpreters/LogicalExpressionsOptimizer.h @@ -32,7 +32,7 @@ class LogicalExpressionsOptimizer final { public: /// Конструктор. Принимает корень DAG запроса. - LogicalExpressionsOptimizer(ASTPtr root_); + LogicalExpressionsOptimizer(ASTSelectQuery * select_query_); /** Заменить все довольно длинные однородные OR-цепочки expr = x1 OR ... OR expr = xN * на выражения expr IN (x1, ..., xN). @@ -69,7 +69,6 @@ private: void fixBrokenOrExpressions(); private: - ASTPtr root; ASTSelectQuery * select_query; /// Информация про OR-цепочки внутри запроса. DisjunctiveEqualitiesMap disjunctive_equalities_map; diff --git a/dbms/src/Interpreters/ExpressionAnalyzer.cpp b/dbms/src/Interpreters/ExpressionAnalyzer.cpp index f64225af3b2..446ce5bb82d 100644 --- a/dbms/src/Interpreters/ExpressionAnalyzer.cpp +++ b/dbms/src/Interpreters/ExpressionAnalyzer.cpp @@ -77,7 +77,7 @@ void ExpressionAnalyzer::init() LOG_DEBUG(&Logger::get("ExpressionAnalyzer"), "######################################"); } - LogicalExpressionsOptimizer logical_expressions_optimizer(ast); + LogicalExpressionsOptimizer logical_expressions_optimizer(select_query); logical_expressions_optimizer.optimizeDisjunctiveEqualityChains(); { diff --git a/dbms/src/Interpreters/LogicalExpressionsOptimizer.cpp b/dbms/src/Interpreters/LogicalExpressionsOptimizer.cpp index 6205742c4cb..14949ab9665 100644 --- a/dbms/src/Interpreters/LogicalExpressionsOptimizer.cpp +++ b/dbms/src/Interpreters/LogicalExpressionsOptimizer.cpp @@ -34,8 +34,8 @@ bool operator<(const OrWithExpression & lhs, const OrWithExpression & rhs) return false; } -LogicalExpressionsOptimizer::LogicalExpressionsOptimizer(ASTPtr root_) - : root(root_), select_query(typeid_cast(&*root)) +LogicalExpressionsOptimizer::LogicalExpressionsOptimizer(ASTSelectQuery * select_query_) + : select_query(select_query_) { } @@ -58,21 +58,21 @@ void LogicalExpressionsOptimizer::optimizeDisjunctiveEqualityChains() void LogicalExpressionsOptimizer::collectDisjunctiveEqualityChains() { - using Edge = std::pair; + using Edge = std::pair; std::deque to_visit; - to_visit.push_back(Edge(ASTPtr(), root)); + to_visit.push_back(Edge(nullptr, select_query)); while (!to_visit.empty()) { auto edge = to_visit.front(); - auto & from_node = edge.first; - auto & to_node = edge.second; + auto from_node = edge.first; + auto to_node = edge.second; to_visit.pop_front(); bool found_chain = false; - auto function = typeid_cast(&*to_node); + auto function = typeid_cast(to_node); if ((function != nullptr) && (function->name == "or") && (function->children.size() == 1)) { auto expression_list = typeid_cast(&*(function->children[0])); @@ -101,14 +101,14 @@ void LogicalExpressionsOptimizer::collectDisjunctiveEqualityChains() } } - if (!from_node.isNull() && found_chain) - or_parent_map[function].push_back(from_node.get()); + if ((from_node != nullptr) && found_chain) + or_parent_map[function].push_back(from_node); } if (!found_chain) for (auto & child : to_node->children) if (typeid_cast(&*child) == nullptr) - to_visit.push_back(Edge(to_node, child)); + to_visit.push_back(Edge(to_node, child.get())); } for (auto & chain : disjunctive_equalities_map)