diff --git a/dbcon/execplan/selectfilter.cpp b/dbcon/execplan/selectfilter.cpp index 39994a073..e1c2f01a0 100644 --- a/dbcon/execplan/selectfilter.cpp +++ b/dbcon/execplan/selectfilter.cpp @@ -26,6 +26,7 @@ using namespace std; #include "selectfilter.h" +#include "simplecolumn.h" #include "bytestream.h" #include "objectreader.h" @@ -62,7 +63,8 @@ const string SelectFilter::toString() const { ostringstream oss; oss << "SelectFilter " - << "returnedColPos=" << fReturnedColPos << endl; + << "returnedColPos=" << fReturnedColPos + << " correlated " << fCorrelated << endl; for (uint32_t i = 0; i < fCols.size(); i++) oss << fCols[i]->toString(); @@ -214,4 +216,32 @@ bool SelectFilter::operator!=(const TreeNode* t) const return (!(*this == t)); } + +void SelectFilter::setSimpleColumnListExtended() +{ + fSimpleColumnListExtended.clear(); + for (auto col : fCols) + { + col->setSimpleColumnListExtended(); + fSimpleColumnListExtended.insert(fSimpleColumnListExtended.end(), + col->simpleColumnListExtended().begin(), + col->simpleColumnListExtended().end()); + } + if (fCorrelated) + { + auto* subFilters = fSub->filters(); + if (subFilters) + { + std::vector simpleColumns; + subFilters->walk(execplan::getSimpleColsExtended, &simpleColumns); + fSimpleColumnListExtended.insert(fSimpleColumnListExtended.end(), + simpleColumns.begin(), + simpleColumns.end()); + } + } +} + +const std::vector& SelectFilter::simpleColumnListExtended() +{ return fSimpleColumnListExtended; } + } // namespace execplan diff --git a/dbcon/execplan/selectfilter.h b/dbcon/execplan/selectfilter.h index 712550333..eabf384f9 100644 --- a/dbcon/execplan/selectfilter.h +++ b/dbcon/execplan/selectfilter.h @@ -170,6 +170,9 @@ class SelectFilter : public Filter */ bool operator!=(const SelectFilter& t) const; + void setSimpleColumnListExtended(); + const std::vector& simpleColumnListExtended(); + private: // default okay? // SelectFilter& operator=(const SelectFilter& rhs); @@ -180,6 +183,7 @@ class SelectFilter : public Filter bool fCorrelated; std::string fData; uint64_t fReturnedColPos; // offset in fSub->returnedColList to indicate the start of projection + std::vector fSimpleColumnListExtended{}; }; std::ostream& operator<<(std::ostream& output, const SelectFilter& rhs); diff --git a/dbcon/execplan/simplecolumn.cpp b/dbcon/execplan/simplecolumn.cpp index 7030efd67..2570cabfe 100644 --- a/dbcon/execplan/simplecolumn.cpp +++ b/dbcon/execplan/simplecolumn.cpp @@ -48,6 +48,7 @@ using namespace joblist; #include "functioncolumn.h" #include "simplecolumn.h" #include "simplefilter.h" +#include "selectfilter.h" #include "aggregatecolumn.h" #include "constantfilter.h" #include "../../utils/windowfunction/windowfunction.h" @@ -95,12 +96,13 @@ 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); + ConstantFilter* cf = dynamic_cast(tn); + FunctionColumn* fc = dynamic_cast(tn); + SimpleColumn* sc = dynamic_cast(tn); + SelectFilter* selectFilter = dynamic_cast(tn); + SimpleFilter* sf = dynamic_cast(tn); if (sc) { @@ -126,6 +128,11 @@ void getSimpleColsExtended(execplan::ParseTree* n, void* obj) sf->setSimpleColumnListExtended(); list->insert(list->end(), sf->simpleColumnListExtended().begin(), sf->simpleColumnListExtended().end()); } + else if (selectFilter) + { + selectFilter->setSimpleColumnListExtended(); + list->insert(list->end(), selectFilter->simpleColumnListExtended().begin(), selectFilter->simpleColumnListExtended().end()); + } else if (cf) { cf->setSimpleColumnListExtended();