diff --git a/dbcon/mysql/ha_mcs_client_udfs.cpp b/dbcon/mysql/ha_mcs_client_udfs.cpp index 3025a33d7..2c1e40c66 100644 --- a/dbcon/mysql/ha_mcs_client_udfs.cpp +++ b/dbcon/mysql/ha_mcs_client_udfs.cpp @@ -978,8 +978,8 @@ extern "C" return 0; } - if (l > TraceSize) - l = TraceSize; + if (l > TraceSize * 100) + l = TraceSize * 100; *length = l; return out->c_str(); diff --git a/dbcon/mysql/ha_mcs_execplan.cpp b/dbcon/mysql/ha_mcs_execplan.cpp index ad674499c..d2f50bd55 100644 --- a/dbcon/mysql/ha_mcs_execplan.cpp +++ b/dbcon/mysql/ha_mcs_execplan.cpp @@ -129,7 +129,6 @@ static void store_query_plan(execplan::SCSEP& csep, PlanType planType) } } - static void store_applied_rules(const std::string rboRules) { cal_connection_info* ci = ensure_conn_info(); diff --git a/dbcon/rbo/rbo_apply_parallel_ces.cpp b/dbcon/rbo/rbo_apply_parallel_ces.cpp index a868eaf28..84752c0f3 100644 --- a/dbcon/rbo/rbo_apply_parallel_ces.cpp +++ b/dbcon/rbo/rbo_apply_parallel_ces.cpp @@ -79,8 +79,8 @@ bool someForeignTablesHasStatisticsAndMbIndex(execplan::CalpontSelectExecutionPl [&ctx](const auto& table) { cal_impl_if::SchemaAndTableName schemaAndTableName = {table.schema, table.table}; - return (!table.isColumnstore() && - ctx.getGwi().tableStatisticsMap.find(schemaAndTableName) != ctx.getGwi().tableStatisticsMap.end()); + return (!table.isColumnstore() && ctx.getGwi().tableStatisticsMap.find(schemaAndTableName) != + ctx.getGwi().tableStatisticsMap.end()); }); } diff --git a/dbcon/rbo/rbo_predicate_pushdown.cpp b/dbcon/rbo/rbo_predicate_pushdown.cpp index 444c94328..ee176a21e 100644 --- a/dbcon/rbo/rbo_predicate_pushdown.cpp +++ b/dbcon/rbo/rbo_predicate_pushdown.cpp @@ -29,9 +29,10 @@ namespace optimizer { - using DerivedToFiltersMap = std::map; +using DerivedToFiltersMap = std::map; -bool predicatePushdownFilter(execplan::CalpontSelectExecutionPlan& csep, optimizer::RBOptimizerContext& /*ctx*/) +bool predicatePushdownFilter(execplan::CalpontSelectExecutionPlan& csep, + optimizer::RBOptimizerContext& /*ctx*/) { // The original rule match contains questionable decision to filter out // queries that contains any UNION UNIT with only derived tables. @@ -40,7 +41,6 @@ bool predicatePushdownFilter(execplan::CalpontSelectExecutionPlan& csep, optimiz return !csep.tableList().empty(); } - void setDerivedTable(execplan::ParseTree* n) { execplan::ParseTree* lhs = n->left(); @@ -75,8 +75,9 @@ void setDerivedTable(execplan::ParseTree* n) } } -execplan::ParseTree* setDerivedFilter(cal_impl_if::gp_walk_info* gwip, execplan::ParseTree*& n, DerivedToFiltersMap& filterMap, - const execplan::CalpontSelectExecutionPlan::SelectList& derivedTbList) +execplan::ParseTree* setDerivedFilter(cal_impl_if::gp_walk_info* gwip, execplan::ParseTree*& n, + DerivedToFiltersMap& filterMap, + const execplan::CalpontSelectExecutionPlan::SelectList& derivedTbList) { if (!(n->derivedTable().empty())) { @@ -86,7 +87,8 @@ execplan::ParseTree* setDerivedFilter(cal_impl_if::gp_walk_info* gwip, execplan: for (uint i = 0; i < derivedTbList.size(); i++) { - execplan::CalpontSelectExecutionPlan* plan = dynamic_cast(derivedTbList[i].get()); + execplan::CalpontSelectExecutionPlan* plan = + dynamic_cast(derivedTbList[i].get()); if (plan->derivedTbAlias() == n->derivedTable()) { @@ -159,82 +161,83 @@ bool applyPredicatePushdown(execplan::CalpontSelectExecutionPlan& csep, RBOptimi * that OR involving derived table are emptied and null candidate of each * stacked filter needs to be reset (not null) */ - execplan::ParseTree* pt = csep.filters(); - DerivedToFiltersMap derivedTbFilterMap; - auto& derivedTbList = csep.derivedTableList(); - bool hasBeenApplied = false; + execplan::ParseTree* pt = csep.filters(); + DerivedToFiltersMap derivedTbFilterMap; + auto& derivedTbList = csep.derivedTableList(); + bool hasBeenApplied = false; - if (pt) - { - pt->walk(setDerivedTable); - setDerivedFilter(&ctx.getGwi(), pt, derivedTbFilterMap, derivedTbList); - csep.filters(pt); - } - - // AND the filters of individual stack to the derived table filter tree - // @todo union filters. - // @todo outer join complication - for (uint i = 0; i < derivedTbList.size(); i++) - { - execplan::CalpontSelectExecutionPlan* plan = dynamic_cast(derivedTbList[i].get()); - execplan::CalpontSelectExecutionPlan::ReturnedColumnList derivedColList = plan->returnedCols(); - auto mapIt = derivedTbFilterMap.find(plan->derivedTbAlias()); - - if (mapIt != derivedTbFilterMap.end()) - { - // replace all derived column of this filter with real column from - // derived table projection list. - execplan::ParseTree* mainFilter = new execplan::ParseTree(); - mainFilter->copyTree(*(mapIt->second)); - replaceRefCol(mainFilter, derivedColList); - execplan::ParseTree* derivedFilter = plan->filters(); - - if (derivedFilter) - { - execplan::LogicOperator* op = new execplan::LogicOperator("and"); - execplan::ParseTree* filter = new execplan::ParseTree(op); - filter->left(derivedFilter); - filter->right(mainFilter); - plan->filters(filter); - } - else - { - plan->filters(mainFilter); - } - - // union filter handling - for (uint j = 0; j < plan->unionVec().size(); j++) - { - execplan::CalpontSelectExecutionPlan* unionPlan = - reinterpret_cast(plan->unionVec()[j].get()); - execplan::CalpontSelectExecutionPlan::ReturnedColumnList unionColList = unionPlan->returnedCols(); - execplan::ParseTree* mainFilterForUnion = new execplan::ParseTree(); - mainFilterForUnion->copyTree(*(mapIt->second)); - replaceRefCol(mainFilterForUnion, unionColList); - execplan::ParseTree* unionFilter = unionPlan->filters(); - - if (unionFilter) - { - execplan::LogicOperator* op = new execplan::LogicOperator("and"); - execplan::ParseTree* filter = new execplan::ParseTree(op); - filter->left(unionFilter); - filter->right(mainFilterForUnion); - unionPlan->filters(filter); - } - else - { - unionPlan->filters(mainFilterForUnion); - } - } - hasBeenApplied = true; - } - } - - // clean derivedTbFilterMap because all the filters are copied - for (auto mapIt = derivedTbFilterMap.begin(); mapIt != derivedTbFilterMap.end(); ++mapIt) - { + if (pt) + { + pt->walk(setDerivedTable); + setDerivedFilter(&ctx.getGwi(), pt, derivedTbFilterMap, derivedTbList); + csep.filters(pt); + } + + // AND the filters of individual stack to the derived table filter tree + // @todo union filters. + // @todo outer join complication + for (uint i = 0; i < derivedTbList.size(); i++) + { + execplan::CalpontSelectExecutionPlan* plan = + dynamic_cast(derivedTbList[i].get()); + execplan::CalpontSelectExecutionPlan::ReturnedColumnList derivedColList = plan->returnedCols(); + auto mapIt = derivedTbFilterMap.find(plan->derivedTbAlias()); + + if (mapIt != derivedTbFilterMap.end()) + { + // replace all derived column of this filter with real column from + // derived table projection list. + execplan::ParseTree* mainFilter = new execplan::ParseTree(); + mainFilter->copyTree(*(mapIt->second)); + replaceRefCol(mainFilter, derivedColList); + execplan::ParseTree* derivedFilter = plan->filters(); + + if (derivedFilter) + { + execplan::LogicOperator* op = new execplan::LogicOperator("and"); + execplan::ParseTree* filter = new execplan::ParseTree(op); + filter->left(derivedFilter); + filter->right(mainFilter); + plan->filters(filter); + } + else + { + plan->filters(mainFilter); + } + + // union filter handling + for (uint j = 0; j < plan->unionVec().size(); j++) + { + execplan::CalpontSelectExecutionPlan* unionPlan = + reinterpret_cast(plan->unionVec()[j].get()); + execplan::CalpontSelectExecutionPlan::ReturnedColumnList unionColList = unionPlan->returnedCols(); + execplan::ParseTree* mainFilterForUnion = new execplan::ParseTree(); + mainFilterForUnion->copyTree(*(mapIt->second)); + replaceRefCol(mainFilterForUnion, unionColList); + execplan::ParseTree* unionFilter = unionPlan->filters(); + + if (unionFilter) + { + execplan::LogicOperator* op = new execplan::LogicOperator("and"); + execplan::ParseTree* filter = new execplan::ParseTree(op); + filter->left(unionFilter); + filter->right(mainFilterForUnion); + unionPlan->filters(filter); + } + else + { + unionPlan->filters(mainFilterForUnion); + } + } + hasBeenApplied = true; + } + } + + // clean derivedTbFilterMap because all the filters are copied + for (auto mapIt = derivedTbFilterMap.begin(); mapIt != derivedTbFilterMap.end(); ++mapIt) + { delete (*mapIt).second; - } + } return hasBeenApplied; } diff --git a/dbcon/rbo/rulebased_optimizer.h b/dbcon/rbo/rulebased_optimizer.h index 3c9f1b187..32bfa3e29 100644 --- a/dbcon/rbo/rulebased_optimizer.h +++ b/dbcon/rbo/rulebased_optimizer.h @@ -35,29 +35,61 @@ class RBOptimizerContext { public: RBOptimizerContext() = delete; - RBOptimizerContext(cal_impl_if::gp_walk_info& walk_info, THD& thd, bool logRules, uint cesOptimizationParallelFactor = 50) - : gwi_(walk_info), thd_(thd), logRules_(logRules), cesOptimizationParallelFactor_(cesOptimizationParallelFactor) + RBOptimizerContext(cal_impl_if::gp_walk_info& walk_info, THD& thd, bool logRules, + uint cesOptimizationParallelFactor = 50) + : gwi_(walk_info) + , thd_(thd) + , logRules_(logRules) + , cesOptimizationParallelFactor_(cesOptimizationParallelFactor) { } // Accessors - cal_impl_if::gp_walk_info& getGwi() { return gwi_; } - THD& getThd() { return thd_; } - uint64_t getUniqueId() const { return uniqueId_; } - void incrementUniqueId() { ++uniqueId_; } - bool logRulesEnabled() const { return logRules_; } - uint getCesOptimizationParallelFactor() const { return cesOptimizationParallelFactor_; } + cal_impl_if::gp_walk_info& getGwi() + { + return gwi_; + } + THD& getThd() + { + return thd_; + } + uint64_t getUniqueId() const + { + return uniqueId_; + } + void incrementUniqueId() + { + ++uniqueId_; + } + bool logRulesEnabled() const + { + return logRules_; + } + uint getCesOptimizationParallelFactor() const + { + return cesOptimizationParallelFactor_; + } // Applied rules API - void addAppliedRule(const std::string& name) { appliedRules_.push_back(name); } - const std::vector& getAppliedRules() const { return appliedRules_; } - bool hasAppliedRules() const { return !appliedRules_.empty(); } + void addAppliedRule(const std::string& name) + { + appliedRules_.push_back(name); + } + const std::vector& getAppliedRules() const + { + return appliedRules_; + } + bool hasAppliedRules() const + { + return !appliedRules_.empty(); + } std::string serializeAppliedRules() const { std::string out; for (size_t i = 0; i < appliedRules_.size(); ++i) { - if (i) out += ","; + if (i) + out += ","; out += appliedRules_[i]; } return out;