diff --git a/dbcon/execplan/aggregatecolumn.cpp b/dbcon/execplan/aggregatecolumn.cpp index db8e9e2f6..fa3428b25 100644 --- a/dbcon/execplan/aggregatecolumn.cpp +++ b/dbcon/execplan/aggregatecolumn.cpp @@ -83,6 +83,18 @@ 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 */ @@ -129,18 +141,36 @@ 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; - - parm->setSimpleColumnList(); - for (auto* sc : parm->simpleColumnList()) + + auto aggParmsAsSCVec = (extractSCsfromAggCol) ? getSCsFromRCForExtended(parm) : getSCsFromRC(parm); + + for (auto* sc : aggParmsAsSCVec) { if (sc) { - fSimpleColumnList.push_back(sc); + if (extractSCsfromAggCol) + { + fSimpleColumnListExtended.push_back(sc); + } + else + { + fSimpleColumnList.push_back(sc); + } } } } diff --git a/dbcon/execplan/aggregatecolumn.h b/dbcon/execplan/aggregatecolumn.h index 10d238840..d24e75119 100644 --- a/dbcon/execplan/aggregatecolumn.h +++ b/dbcon/execplan/aggregatecolumn.h @@ -161,7 +161,9 @@ 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 be5a5f5e5..b460cd634 100644 --- a/dbcon/execplan/arithmeticcolumn.cpp +++ b/dbcon/execplan/arithmeticcolumn.cpp @@ -447,6 +447,12 @@ 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 248962084..979b9ce68 100644 --- a/dbcon/execplan/arithmeticcolumn.h +++ b/dbcon/execplan/arithmeticcolumn.h @@ -169,12 +169,10 @@ 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 e3bf5d623..a58ce0d16 100644 --- a/dbcon/execplan/constantfilter.cpp +++ b/dbcon/execplan/constantfilter.cpp @@ -331,4 +331,22 @@ 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 0174604f0..5d0e238d2 100644 --- a/dbcon/execplan/constantfilter.h +++ b/dbcon/execplan/constantfilter.h @@ -202,8 +202,10 @@ 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 @@ -213,6 +215,7 @@ 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 0ceb141e4..7f10e0193 100644 --- a/dbcon/execplan/functioncolumn.cpp +++ b/dbcon/execplan/functioncolumn.cpp @@ -46,7 +46,6 @@ using namespace boost; #include "functor_str.h" using namespace funcexp; - namespace execplan { /** @@ -141,7 +140,8 @@ 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,6 +521,14 @@ 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 bd209a9bd..0a3667506 100644 --- a/dbcon/execplan/functioncolumn.h +++ b/dbcon/execplan/functioncolumn.h @@ -159,12 +159,9 @@ 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 81b892d87..efbd3fb88 100644 --- a/dbcon/execplan/returnedcolumn.cpp +++ b/dbcon/execplan/returnedcolumn.cpp @@ -260,4 +260,9 @@ 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 51355f1aa..4d2212a6d 100644 --- a/dbcon/execplan/returnedcolumn.h +++ b/dbcon/execplan/returnedcolumn.h @@ -287,6 +287,11 @@ 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 @@ -294,6 +299,8 @@ class ReturnedColumn : public TreeNode */ virtual void setSimpleColumnList(); + virtual void setSimpleColumnListExtended(); + // get all aggregate column list in this expression const std::vector& aggColumnList() const { @@ -342,7 +349,10 @@ 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 1eb83871d..7030efd67 100644 --- a/dbcon/execplan/simplecolumn.cpp +++ b/dbcon/execplan/simplecolumn.cpp @@ -91,6 +91,48 @@ 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(); @@ -782,6 +824,18 @@ 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 91e343623..2038c7a2b 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,8 +407,10 @@ 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 b6981c4d9..8ac61522d 100644 --- a/dbcon/execplan/simplefilter.cpp +++ b/dbcon/execplan/simplefilter.cpp @@ -810,6 +810,11 @@ const std::vector& SimpleFilter::simpleColumnList() return fSimpleColumnList; } +const std::vector& SimpleFilter::simpleColumnListExtended() +{ + return fSimpleColumnListExtended; +} + void SimpleFilter::setSimpleColumnList() { SimpleColumn* lsc = dynamic_cast(fLhs); @@ -839,6 +844,35 @@ 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 5267e4a76..6254bf32a 100644 --- a/dbcon/execplan/simplefilter.h +++ b/dbcon/execplan/simplefilter.h @@ -246,8 +246,10 @@ 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(); @@ -265,6 +267,7 @@ 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 7f3726575..de6a86f7c 100644 --- a/dbcon/joblist/jlf_common.cpp +++ b/dbcon/joblist/jlf_common.cpp @@ -67,8 +67,6 @@ 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 44e782ac9..4c65d6bb8 100644 --- a/dbcon/rbo/rbo_apply_parallel_ces.cpp +++ b/dbcon/rbo/rbo_apply_parallel_ces.cpp @@ -523,27 +523,15 @@ void tryToUpdateScToUseRewrittenDerived( } void updateSCsUsingIteration(optimizer::TableAliasToNewAliasAndSCPositionsMap& tableAliasToSCPositionsMap, - std::vector& rcs, const bool ignoreAgg) + std::vector& rcs) { for (auto& rc : rcs) { - rc->setSimpleColumnList(); - for (auto* sc : rc->simpleColumnList()) + rc->setSimpleColumnListExtended(); + for (auto* sc : rc->simpleColumnListExtended()) { tryToUpdateScToUseRewrittenDerived(sc, tableAliasToSCPositionsMap); } - - if (!ignoreAgg && rc->hasAggregate()) - { - for (auto* agc : rc->aggColumnList()) - { - agc->setSimpleColumnList(); - for (auto* sc : agc->simpleColumnList()) - { - tryToUpdateScToUseRewrittenDerived(sc, tableAliasToSCPositionsMap); - } - } - } } } @@ -551,7 +539,7 @@ void updateSCsUsingWalkers(optimizer::TableAliasToNewAliasAndSCPositionsMap& tab execplan::ParseTree* pt) { std::vector simpleColumns; - pt->walk(execplan::getSimpleCols, &simpleColumns); + pt->walk(execplan::getSimpleColsExtended, &simpleColumns); for (auto* sc : simpleColumns) { tryToUpdateScToUseRewrittenDerived(sc, tableAliasToSCPositionsMap); @@ -622,7 +610,7 @@ bool applyParallelCES(execplan::CalpontSelectExecutionPlan& csep, optimizer::RBO { for (auto& rc : csep.returnedCols()) { - updateSCsUsingIteration(tableAliasToSCPositionsMap, csep.returnedCols(), false); + updateSCsUsingIteration(tableAliasToSCPositionsMap, csep.returnedCols()); newReturnedColumns.push_back(rc); } @@ -633,13 +621,13 @@ bool applyParallelCES(execplan::CalpontSelectExecutionPlan& csep, optimizer::RBO // 3d pass over GROUP BY columns if (!csep.groupByCols().empty()) { - updateSCsUsingIteration(tableAliasToSCPositionsMap, csep.groupByCols(), true); + updateSCsUsingIteration(tableAliasToSCPositionsMap, csep.groupByCols()); } // 4th pass over ORDER BY columns if (!csep.orderByCols().empty()) { - updateSCsUsingIteration(tableAliasToSCPositionsMap, csep.orderByCols(), false); + updateSCsUsingIteration(tableAliasToSCPositionsMap, csep.orderByCols()); } // 5th pass over filters to use derived table SCs in filters @@ -676,7 +664,7 @@ bool applyParallelCES(execplan::CalpontSelectExecutionPlan& csep, optimizer::RBO if (auto subFilters = sub->filters()) { std::vector subSCs; - subFilters->walk(execplan::getSimpleCols, &subSCs); + subFilters->walk(execplan::getSimpleColsExtended, &subSCs); for (auto* sc : subSCs) { if (sc) @@ -686,7 +674,7 @@ bool applyParallelCES(execplan::CalpontSelectExecutionPlan& csep, optimizer::RBO if (auto subHaving = sub->having()) { std::vector subSCs; - subHaving->walk(execplan::getSimpleCols, &subSCs); + subHaving->walk(execplan::getSimpleColsExtended, &subSCs); for (auto* sc : subSCs) { if (sc)