1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-04-18 21:44:02 +03:00
2025-02-21 20:02:38 +04:00

269 lines
6.4 KiB
C++

/* Copyright (C) 2014 InfiniDB, Inc.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; version 2 of
the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA. */
// $Id: expressionstep.h 9632 2013-06-18 22:18:20Z xlou $
/** @file
* class ExpStep interface
*/
#pragma once
// #define NDEBUG
#include "jobstep.h"
#include "filter.h"
typedef boost::shared_ptr<SimpleColumn> SSC;
namespace execplan
{
// forward reference
class ReturnedColumn;
class SimpleColumn;
class SimpleFilter;
class WindowFunctionColumn;
}; // namespace execplan
namespace joblist
{
struct JobInfo;
struct FunctionJoinInfo;
class ExpressionStep : public JobStep
{
public:
// constructors
ExpressionStep();
explicit ExpressionStep(const JobInfo&);
// destructor constructors
~ExpressionStep() override;
// inherited methods
void run() override;
void join() override;
const std::string toString() const override;
execplan::CalpontSystemCatalog::OID oid() const override
{
return 0;
}
execplan::CalpontSystemCatalog::OID tableOid() const override
{
return fTableOids.empty() ? 0 : fTableOids.front();
}
using JobStep::alias;
std::string alias() const override
{
return fAliases.empty() ? "" : fAliases.front();
}
using JobStep::view;
std::string view() const override
{
return fViews.empty() ? "" : fViews.front();
}
using JobStep::schema;
std::string schema() const override
{
return fSchemas.empty() ? "" : fSchemas.front();
}
uint32_t tableKey() const
{
return fTableKeys.empty() ? -1 : fTableKeys.front();
}
uint32_t columnKey() const
{
return fColumnKeys.empty() ? -1 : fColumnKeys.front();
}
void expression(const execplan::SRCP exp, JobInfo& jobInfo);
execplan::SRCP expression() const
{
return fExpression;
}
virtual void expressionFilter(const execplan::Filter* filter, JobInfo& jobInfo);
virtual void expressionFilter(const execplan::ParseTree* filter, JobInfo& jobInfo);
execplan::ParseTree* expressionFilter() const
{
return fExpressionFilter;
}
void expressionId(uint64_t eid)
{
fExpressionId = eid;
}
uint64_t expressionId() const
{
return fExpressionId;
}
const std::vector<execplan::CalpontSystemCatalog::OID>& tableOids() const
{
return fTableOids;
}
const std::vector<std::string>& aliases() const
{
return fAliases;
}
const std::vector<std::string>& views() const
{
return fViews;
}
const std::vector<std::string>& schemas() const
{
return fSchemas;
}
const std::vector<uint32_t>& tableKeys() const
{
return fTableKeys;
}
const std::vector<uint32_t>& columnKeys() const
{
return fColumnKeys;
}
std::vector<execplan::CalpontSystemCatalog::OID>& tableOids()
{
return fTableOids;
}
std::vector<std::string>& aliases()
{
return fAliases;
}
std::vector<std::string>& views()
{
return fViews;
}
std::vector<std::string>& schemas()
{
return fSchemas;
}
std::vector<uint32_t>& tableKeys()
{
return fTableKeys;
}
std::vector<uint32_t>& columnKeys()
{
return fColumnKeys;
}
virtual void updateInputIndex(std::map<uint32_t, uint32_t>& indexMap, const JobInfo& jobInfo);
virtual void updateOutputIndex(std::map<uint32_t, uint32_t>& indexMap, const JobInfo& jobInfo);
virtual void updateColumnOidAlias(JobInfo& jobInfo);
std::vector<execplan::ReturnedColumn*>& columns()
{
return fColumns;
}
void substitute(uint64_t, const SSC&);
void selectFilter(bool b)
{
fSelectFilter = b;
}
bool selectFilter() const
{
return fSelectFilter;
}
void associatedJoinId(uint64_t i)
{
fAssociatedJoinId = i;
}
uint64_t associatedJoinId() const
{
return fAssociatedJoinId;
}
void functionJoin(bool b)
{
fDoJoin = b;
}
bool functionJoin() const
{
return fDoJoin;
}
void virtualStep(bool b)
{
fVirtual = b;
}
bool virtualStep() const
{
return fVirtual;
}
boost::shared_ptr<FunctionJoinInfo>& functionJoinInfo()
{
return fFunctionJoinInfo;
}
void resetJoinInfo()
{
fFunctionJoinInfo.reset();
}
protected:
virtual void addColumn(execplan::ReturnedColumn* rc, JobInfo& jobInfo);
virtual void addFilter(execplan::ParseTree* filter, JobInfo& jobInfo);
virtual void addSimpleFilter(execplan::SimpleFilter* sf, JobInfo& jobInfo);
virtual void populateColumnInfo(execplan::ReturnedColumn* rc, JobInfo& jobInfo);
virtual void populateColumnInfo(execplan::SimpleColumn* sc, JobInfo& jobInfo);
virtual void populateColumnInfo(execplan::WindowFunctionColumn* wc, JobInfo& jobInfo);
virtual void populateColumnInfo(execplan::AggregateColumn* ac, JobInfo& jobInfo);
virtual void functionJoinCheck(execplan::SimpleFilter* sf, JobInfo& jobInfo);
virtual bool parseFuncJoinColumn(ReturnedColumn* rc, JobInfo& jobInfo);
// expression
execplan::SRCP fExpression;
execplan::ParseTree* fExpressionFilter;
uint64_t fExpressionId;
// columns accessed
std::vector<execplan::CalpontSystemCatalog::OID> fTableOids;
std::vector<std::string> fAliases;
std::vector<std::string> fViews;
std::vector<std::string> fSchemas;
std::vector<uint32_t> fTableKeys;
std::vector<uint32_t> fColumnKeys;
std::vector<execplan::ReturnedColumn*> fColumns;
private:
// disable copy constructor
// Cannot copy fColumns, which depends on fExpressionFilter.
ExpressionStep(const ExpressionStep&);
// for VARBINARY, only support limited number of functions: like hex(), length(), etc.
bool fVarBinOK;
// @bug 3780, for select filter
bool fSelectFilter;
// @bug 3037, outer join with additional comparison
uint64_t fAssociatedJoinId;
// @bug 4531, for window function in IN/EXISTS sub-query.
std::map<execplan::SimpleColumn*, execplan::ReturnedColumn*> fSubMap;
std::set<SSC> fVsc; // for substitute wc with vsc
// @bug 3683, function join
boost::shared_ptr<FunctionJoinInfo> fFunctionJoinInfo;
bool fDoJoin;
bool fVirtual;
};
} // namespace joblist