diff --git a/dbcon/mysql/rulebased_optimizer.cpp b/dbcon/mysql/rulebased_optimizer.cpp index 4af61396c..ee674cfba 100644 --- a/dbcon/mysql/rulebased_optimizer.cpp +++ b/dbcon/mysql/rulebased_optimizer.cpp @@ -18,6 +18,7 @@ #include "constantcolumn.h" #include "execplan/calpontselectexecutionplan.h" #include "execplan/simplecolumn.h" +#include "existsfilter.h" #include "logicoperator.h" #include "operator.h" #include "predicateoperator.h" @@ -95,6 +96,37 @@ bool Rule::walk(execplan::CalpontSelectExecutionPlan& csep) const rewrite |= walk(unionUnitLocal); } + if (csep.filters() != nullptr) + { + bool rewriteLocal = false; + std::vector stack; + stack.push_back(csep.filters()); + while (!stack.empty()) + { + execplan::ParseTree* node = stack.back(); + stack.pop_back(); + if (node == nullptr) + continue; + + auto* existsFilter = dynamic_cast(node->data()); + if (existsFilter) + { + if (matchRule(*existsFilter->sub())) + { + applyRule(*existsFilter->sub()); + rewriteLocal = true; + } + } + + if (node->right()) + stack.push_back(node->right()); + if (node->left()) + stack.push_back(node->left()); + } + if (rewriteLocal) + rewrite |= rewriteLocal; + } + if (matchRule(csep)) { applyRule(csep);