diff --git a/dbcon/execplan/aggregatecolumn.cpp b/dbcon/execplan/aggregatecolumn.cpp index fa3428b25..db8e9e2f6 100644 --- a/dbcon/execplan/aggregatecolumn.cpp +++ b/dbcon/execplan/aggregatecolumn.cpp @@ -83,18 +83,6 @@ void getAggCols(execplan::ParseTree* n, void* obj) } } -const std::vector& getSCsFromRCForExtended(const SRCP& srcp) -{ - srcp->setSimpleColumnListExtended(); - return srcp->simpleColumnListExtended(); -} - -const std::vector& getSCsFromRC(const SRCP& srcp) -{ - srcp->setSimpleColumnList(); - return srcp->simpleColumnList(); -} - /** * Constructors/Destructors */ @@ -141,36 +129,18 @@ AggregateColumn::AggregateColumn(const AggregateColumn& rhs, const uint32_t sess void AggregateColumn::setSimpleColumnList() { fSimpleColumnList.clear(); - return setSimpleColumnList_(false); -} -void AggregateColumn::setSimpleColumnListExtended() -{ - fSimpleColumnListExtended.clear(); - return setSimpleColumnList_(true); -} - -void AggregateColumn::setSimpleColumnList_(const bool extractSCsfromAggCol) -{ for (const auto& parm : aggParms()) { if (!parm) continue; - - auto aggParmsAsSCVec = (extractSCsfromAggCol) ? getSCsFromRCForExtended(parm) : getSCsFromRC(parm); - - for (auto* sc : aggParmsAsSCVec) + + parm->setSimpleColumnList(); + for (auto* sc : parm->simpleColumnList()) { if (sc) { - if (extractSCsfromAggCol) - { - fSimpleColumnListExtended.push_back(sc); - } - else - { - fSimpleColumnList.push_back(sc); - } + fSimpleColumnList.push_back(sc); } } } diff --git a/dbcon/execplan/aggregatecolumn.h b/dbcon/execplan/aggregatecolumn.h index d24e75119..10d238840 100644 --- a/dbcon/execplan/aggregatecolumn.h +++ b/dbcon/execplan/aggregatecolumn.h @@ -161,9 +161,7 @@ class AggregateColumn : public ReturnedColumn fAggParms = parms; } - void setSimpleColumnList_(const bool extractSCsfromAggCol); void setSimpleColumnList() override; - void setSimpleColumnListExtended() override; /** return a copy of this pointer * diff --git a/dbcon/execplan/arithmeticcolumn.cpp b/dbcon/execplan/arithmeticcolumn.cpp index b460cd634..be5a5f5e5 100644 --- a/dbcon/execplan/arithmeticcolumn.cpp +++ b/dbcon/execplan/arithmeticcolumn.cpp @@ -447,12 +447,6 @@ void ArithmeticColumn::setSimpleColumnList() fExpression->walk(getSimpleCols, &fSimpleColumnList); } -void ArithmeticColumn::setSimpleColumnListExtended() -{ - fSimpleColumnListExtended.clear(); - fExpression->walk(getSimpleColsExtended, &fSimpleColumnListExtended); -} - std::optional ArithmeticColumn::singleTable() { setSimpleColumnList(); diff --git a/dbcon/execplan/arithmeticcolumn.h b/dbcon/execplan/arithmeticcolumn.h index 979b9ce68..248962084 100644 --- a/dbcon/execplan/arithmeticcolumn.h +++ b/dbcon/execplan/arithmeticcolumn.h @@ -169,10 +169,12 @@ class ArithmeticColumn : public ReturnedColumn void setDerivedTable() override; void replaceRealCol(std::vector&) override; + const std::vector& simpleColumnList() const override + { + return fSimpleColumnList; + } void setSimpleColumnList() override; - void setSimpleColumnListExtended() override; - /** * Return the table that the column arguments belong to. * diff --git a/dbcon/execplan/constantfilter.cpp b/dbcon/execplan/constantfilter.cpp index a58ce0d16..e3bf5d623 100644 --- a/dbcon/execplan/constantfilter.cpp +++ b/dbcon/execplan/constantfilter.cpp @@ -331,22 +331,4 @@ void ConstantFilter::setSimpleColumnList() } } -const std::vector& ConstantFilter::simpleColumnListExtended() -{ - return fSimpleColumnListExtended; -} - -void ConstantFilter::setSimpleColumnListExtended() -{ - fSimpleColumnListExtended.clear(); - - for (uint32_t i = 0; i < fFilterList.size(); i++) - { - fFilterList[i]->setSimpleColumnListExtended(); - fSimpleColumnListExtended.insert(fSimpleColumnListExtended.end(), - fFilterList[i]->simpleColumnListExtended().begin(), - fFilterList[i]->simpleColumnListExtended().end()); - } -} - } // namespace execplan diff --git a/dbcon/execplan/constantfilter.h b/dbcon/execplan/constantfilter.h index 5d0e238d2..0174604f0 100644 --- a/dbcon/execplan/constantfilter.h +++ b/dbcon/execplan/constantfilter.h @@ -202,10 +202,8 @@ class ConstantFilter : public Filter // get all simple columns involved in this column const std::vector& simpleColumnList(); - const std::vector& simpleColumnListExtended(); // walk through the constant filter operands to re-populate fSimpleColumnList void setSimpleColumnList(); - void setSimpleColumnListExtended(); // get all aggregate columns involved in this column const std::vector& aggColumnList() const @@ -215,7 +213,6 @@ class ConstantFilter : public Filter private: std::vector fSimpleColumnList; - std::vector fSimpleColumnListExtended{}; std::vector fAggColumnList; std::vector fWindowFunctionColumnList; }; diff --git a/dbcon/execplan/functioncolumn.cpp b/dbcon/execplan/functioncolumn.cpp index 7f10e0193..0ceb141e4 100644 --- a/dbcon/execplan/functioncolumn.cpp +++ b/dbcon/execplan/functioncolumn.cpp @@ -46,6 +46,7 @@ using namespace boost; #include "functor_str.h" using namespace funcexp; + namespace execplan { /** @@ -140,8 +141,7 @@ string FunctionColumn::toCppCode(IncludeSet& includes) const auto fFuncParmsInString = fData.substr(fFunctionName.size() + 1, fData.size() - fFunctionName.size() - 2); - ss << "FunctionColumn(" << std::quoted(fFunctionName) << ", " << std::quoted(fFuncParmsInString) << ", " - << sessionID() << ")"; + ss << "FunctionColumn(" << std::quoted(fFunctionName) << ", " << std::quoted(fFuncParmsInString) << ", " << sessionID() << ")"; return ss.str(); } @@ -521,14 +521,6 @@ void FunctionColumn::setSimpleColumnList() fFunctionParms[i]->walk(getSimpleCols, &fSimpleColumnList); } -void FunctionColumn::setSimpleColumnListExtended() -{ - fSimpleColumnListExtended.clear(); - - for (uint i = 0; i < fFunctionParms.size(); i++) - fFunctionParms[i]->walk(getSimpleColsExtended, &fSimpleColumnListExtended); -} - std::optional FunctionColumn::singleTable() { setSimpleColumnList(); diff --git a/dbcon/execplan/functioncolumn.h b/dbcon/execplan/functioncolumn.h index 0a3667506..bd209a9bd 100644 --- a/dbcon/execplan/functioncolumn.h +++ b/dbcon/execplan/functioncolumn.h @@ -159,9 +159,12 @@ class FunctionColumn : public ReturnedColumn bool hasWindowFunc() override; void setDerivedTable() override; void replaceRealCol(std::vector&) override; + virtual const std::vector& simpleColumnList() const override + { + return fSimpleColumnList; + } void setSimpleColumnList() override; - void setSimpleColumnListExtended() override; /** * Return the tableAlias name of the table that the column arguments belong to. * diff --git a/dbcon/execplan/returnedcolumn.cpp b/dbcon/execplan/returnedcolumn.cpp index efbd3fb88..81b892d87 100644 --- a/dbcon/execplan/returnedcolumn.cpp +++ b/dbcon/execplan/returnedcolumn.cpp @@ -260,9 +260,4 @@ void ReturnedColumn::setSimpleColumnList() fSimpleColumnList.clear(); } -void ReturnedColumn::setSimpleColumnListExtended() -{ - fSimpleColumnListExtended.clear(); -} - } // namespace execplan diff --git a/dbcon/execplan/returnedcolumn.h b/dbcon/execplan/returnedcolumn.h index 4d2212a6d..51355f1aa 100644 --- a/dbcon/execplan/returnedcolumn.h +++ b/dbcon/execplan/returnedcolumn.h @@ -287,11 +287,6 @@ class ReturnedColumn : public TreeNode return fSimpleColumnList; } - virtual const std::vector& simpleColumnListExtended() const - { - return fSimpleColumnListExtended; - } - /* @brief traverse this ReturnedColumn and re-populate fSimpleColumnList. * * @note all ReturnedColumns that may have simple column arguments added @@ -299,8 +294,6 @@ class ReturnedColumn : public TreeNode */ virtual void setSimpleColumnList(); - virtual void setSimpleColumnListExtended(); - // get all aggregate column list in this expression const std::vector& aggColumnList() const { @@ -349,10 +342,7 @@ class ReturnedColumn : public TreeNode uint64_t fOrderPos; /// for order by and group by column uint64_t fColSource; /// from which subquery int64_t fColPosition; /// the column position in the source subquery - // The difference b/w the two vectors is that the second one is used to store SCs - // are are used by AggegateColumn. std::vector fSimpleColumnList; - std::vector fSimpleColumnListExtended{}; std::vector fAggColumnList; std::vector fWindowFunctionColumnList; bool fHasAggregate; /// connector internal use. no need to serialize diff --git a/dbcon/execplan/simplecolumn.cpp b/dbcon/execplan/simplecolumn.cpp index 7030efd67..1eb83871d 100644 --- a/dbcon/execplan/simplecolumn.cpp +++ b/dbcon/execplan/simplecolumn.cpp @@ -91,48 +91,6 @@ void getSimpleCols(execplan::ParseTree* n, void* obj) } } -void getSimpleColsExtended(execplan::ParseTree* n, void* obj) -{ - vector* list = reinterpret_cast*>(obj); - TreeNode* tn = n->data(); - SimpleColumn* sc = dynamic_cast(tn); - FunctionColumn* fc = dynamic_cast(tn); - ArithmeticColumn* ac = dynamic_cast(tn); - SimpleFilter* sf = dynamic_cast(tn); - ConstantFilter* cf = dynamic_cast(tn); - AggregateColumn* agc = dynamic_cast(tn); - - if (sc) - { - list->push_back(sc); - } - else if (fc) - { - fc->setSimpleColumnListExtended(); - list->insert(list->end(), fc->simpleColumnListExtended().begin(), fc->simpleColumnListExtended().end()); - } - else if (ac) - { - ac->setSimpleColumnListExtended(); - list->insert(list->end(), ac->simpleColumnListExtended().begin(), ac->simpleColumnListExtended().end()); - } - else if (agc) - { - agc->setSimpleColumnListExtended(); - list->insert(list->end(), agc->simpleColumnListExtended().begin(), agc->simpleColumnListExtended().end()); - } - else if (sf) - { - sf->setSimpleColumnListExtended(); - list->insert(list->end(), sf->simpleColumnListExtended().begin(), sf->simpleColumnListExtended().end()); - } - else if (cf) - { - cf->setSimpleColumnListExtended(); - list->insert(list->end(), cf->simpleColumnListExtended().begin(), cf->simpleColumnListExtended().end()); - } -} - ParseTree* replaceRefCol(ParseTree*& n, CalpontSelectExecutionPlan::ReturnedColumnList& derivedColList) { ParseTree* lhs = n->left(); @@ -824,18 +782,6 @@ void SimpleColumn::setSimpleColumnList() } } -void SimpleColumn::setSimpleColumnListExtended() -{ - if (fSimpleColumnListExtended.empty()) - { - fSimpleColumnListExtended.push_back(this); - } - else - { - fSimpleColumnListExtended.back() = this; - } -} - std::optional sameTableCheck( std::vector simpleColumnList) { diff --git a/dbcon/execplan/simplecolumn.h b/dbcon/execplan/simplecolumn.h index 2038c7a2b..91e343623 100644 --- a/dbcon/execplan/simplecolumn.h +++ b/dbcon/execplan/simplecolumn.h @@ -266,7 +266,7 @@ class SimpleColumn : public ReturnedColumn std::optional singleTable() override; void setSimpleColumnList() override; - void setSimpleColumnListExtended() override; + protected: /** @@ -407,10 +407,8 @@ std::ostream& operator<<(std::ostream& output, const SimpleColumn& rhs); * utility function to extract all simple columns from a parse tree */ void getSimpleCols(ParseTree* n, void* obj); -void getSimpleColsExtended(execplan::ParseTree* n, void* obj); ParseTree* replaceRefCol(ParseTree*& n, CalpontSelectExecutionPlan::ReturnedColumnList&); -std::optional sameTableCheck( - std::vector simpleColumnList); +std::optional sameTableCheck(std::vector simpleColumnList); } // namespace execplan diff --git a/dbcon/execplan/simplefilter.cpp b/dbcon/execplan/simplefilter.cpp index 8ac61522d..b6981c4d9 100644 --- a/dbcon/execplan/simplefilter.cpp +++ b/dbcon/execplan/simplefilter.cpp @@ -810,11 +810,6 @@ const std::vector& SimpleFilter::simpleColumnList() return fSimpleColumnList; } -const std::vector& SimpleFilter::simpleColumnListExtended() -{ - return fSimpleColumnListExtended; -} - void SimpleFilter::setSimpleColumnList() { SimpleColumn* lsc = dynamic_cast(fLhs); @@ -844,35 +839,6 @@ void SimpleFilter::setSimpleColumnList() } } -void SimpleFilter::setSimpleColumnListExtended() -{ - SimpleColumn* lsc = dynamic_cast(fLhs); - SimpleColumn* rsc = dynamic_cast(fRhs); - fSimpleColumnListExtended.clear(); - - if (lsc) - { - fSimpleColumnListExtended.push_back(lsc); - } - else if (fLhs) - { - fLhs->setSimpleColumnListExtended(); - fSimpleColumnList.insert(fSimpleColumnList.end(), fLhs->simpleColumnListExtended().begin(), - fLhs->simpleColumnListExtended().end()); - } - - if (rsc) - { - fSimpleColumnList.push_back(rsc); - } - else if (fRhs) - { - fRhs->setSimpleColumnListExtended(); - fSimpleColumnList.insert(fSimpleColumnList.end(), fRhs->simpleColumnListExtended().begin(), - fRhs->simpleColumnListExtended().end()); - } -} - bool SimpleFilter::hasAggregate() { if (fAggColumnList.empty()) diff --git a/dbcon/execplan/simplefilter.h b/dbcon/execplan/simplefilter.h index 6254bf32a..5267e4a76 100644 --- a/dbcon/execplan/simplefilter.h +++ b/dbcon/execplan/simplefilter.h @@ -246,10 +246,8 @@ class SimpleFilter : public Filter // get all simple columns involved in this column const std::vector& simpleColumnList(); - const std::vector& simpleColumnListExtended(); // walk through the simple filter operands to re-populate fSimpleColumnList void setSimpleColumnList(); - void setSimpleColumnListExtended(); // walk through the simple filter operands to check existence of aggregate bool hasAggregate(); @@ -267,7 +265,6 @@ class SimpleFilter : public Filter private: std::vector fSimpleColumnList; - std::vector fSimpleColumnListExtended{}; std::vector fAggColumnList; std::vector fWindowFunctionColumnList; }; diff --git a/dbcon/joblist/jlf_common.cpp b/dbcon/joblist/jlf_common.cpp index de6a86f7c..7f3726575 100644 --- a/dbcon/joblist/jlf_common.cpp +++ b/dbcon/joblist/jlf_common.cpp @@ -67,6 +67,8 @@ uint32_t uniqTupleKey(JobInfo& jobInfo, CalpontSystemCatalog::OID& o, CalpontSys return iter->second; uint32_t newId = jobInfo.keyInfo->nextKey++; + // cout << "new id: " << newId << " -- " << o << ", " << pi << ", " << nm << ", " << vw << ", " << sn << ", + // " << subId << endl; jobInfo.keyInfo->tupleKeyMap[id] = newId; jobInfo.keyInfo->tupleKeyVec.push_back(id); jobInfo.keyInfo->tupleKeyToTableOid.insert(make_pair(newId, t)); diff --git a/dbcon/rbo/rbo_apply_parallel_ces.cpp b/dbcon/rbo/rbo_apply_parallel_ces.cpp index 4c65d6bb8..44e782ac9 100644 --- a/dbcon/rbo/rbo_apply_parallel_ces.cpp +++ b/dbcon/rbo/rbo_apply_parallel_ces.cpp @@ -523,15 +523,27 @@ void tryToUpdateScToUseRewrittenDerived( } void updateSCsUsingIteration(optimizer::TableAliasToNewAliasAndSCPositionsMap& tableAliasToSCPositionsMap, - std::vector& rcs) + std::vector& rcs, const bool ignoreAgg) { for (auto& rc : rcs) { - rc->setSimpleColumnListExtended(); - for (auto* sc : rc->simpleColumnListExtended()) + rc->setSimpleColumnList(); + for (auto* sc : rc->simpleColumnList()) { tryToUpdateScToUseRewrittenDerived(sc, tableAliasToSCPositionsMap); } + + if (!ignoreAgg && rc->hasAggregate()) + { + for (auto* agc : rc->aggColumnList()) + { + agc->setSimpleColumnList(); + for (auto* sc : agc->simpleColumnList()) + { + tryToUpdateScToUseRewrittenDerived(sc, tableAliasToSCPositionsMap); + } + } + } } } @@ -539,7 +551,7 @@ void updateSCsUsingWalkers(optimizer::TableAliasToNewAliasAndSCPositionsMap& tab execplan::ParseTree* pt) { std::vector simpleColumns; - pt->walk(execplan::getSimpleColsExtended, &simpleColumns); + pt->walk(execplan::getSimpleCols, &simpleColumns); for (auto* sc : simpleColumns) { tryToUpdateScToUseRewrittenDerived(sc, tableAliasToSCPositionsMap); @@ -610,7 +622,7 @@ bool applyParallelCES(execplan::CalpontSelectExecutionPlan& csep, optimizer::RBO { for (auto& rc : csep.returnedCols()) { - updateSCsUsingIteration(tableAliasToSCPositionsMap, csep.returnedCols()); + updateSCsUsingIteration(tableAliasToSCPositionsMap, csep.returnedCols(), false); newReturnedColumns.push_back(rc); } @@ -621,13 +633,13 @@ bool applyParallelCES(execplan::CalpontSelectExecutionPlan& csep, optimizer::RBO // 3d pass over GROUP BY columns if (!csep.groupByCols().empty()) { - updateSCsUsingIteration(tableAliasToSCPositionsMap, csep.groupByCols()); + updateSCsUsingIteration(tableAliasToSCPositionsMap, csep.groupByCols(), true); } // 4th pass over ORDER BY columns if (!csep.orderByCols().empty()) { - updateSCsUsingIteration(tableAliasToSCPositionsMap, csep.orderByCols()); + updateSCsUsingIteration(tableAliasToSCPositionsMap, csep.orderByCols(), false); } // 5th pass over filters to use derived table SCs in filters @@ -664,7 +676,7 @@ bool applyParallelCES(execplan::CalpontSelectExecutionPlan& csep, optimizer::RBO if (auto subFilters = sub->filters()) { std::vector subSCs; - subFilters->walk(execplan::getSimpleColsExtended, &subSCs); + subFilters->walk(execplan::getSimpleCols, &subSCs); for (auto* sc : subSCs) { if (sc) @@ -674,7 +686,7 @@ bool applyParallelCES(execplan::CalpontSelectExecutionPlan& csep, optimizer::RBO if (auto subHaving = sub->having()) { std::vector subSCs; - subHaving->walk(execplan::getSimpleColsExtended, &subSCs); + subHaving->walk(execplan::getSimpleCols, &subSCs); for (auto* sc : subSCs) { if (sc)