greenplumn CScalar 源码
greenplumn CScalar 代码
文件路径:/src/backend/gporca/libgpopt/include/gpopt/operators/CScalar.h
//---------------------------------------------------------------------------
// Greenplum Database
// Copyright (C) 2009 Greenplum, Inc.
//
// @filename:
// CScalar.h
//
// @doc:
// Base class for all scalar operators
//---------------------------------------------------------------------------
#ifndef GPOPT_CScalar_H
#define GPOPT_CScalar_H
#include "gpos/base.h"
#include "gpopt/base/CDrvdProp.h"
#include "gpopt/base/CPartInfo.h"
#include "gpopt/mdcache/CMDAccessor.h"
#include "gpopt/operators/COperator.h"
#include "naucrates/md/IMDId.h"
namespace gpopt
{
using namespace gpos;
using namespace gpmd;
// forward declaration
class CColRefSet;
//---------------------------------------------------------------------------
// @class:
// CScalar
//
// @doc:
// base class for all scalar operators
//
//---------------------------------------------------------------------------
class CScalar : public COperator
{
public:
// possible results of Boolean evaluation of a scalar expression
enum EBoolEvalResult
{
EberTrue = 1, // TRUE
EberFalse, // FALSE
EberNull, // NULL
EberNotTrue, // FALSE or NULL
EberAny, // Any result is possible
EerSentinel
};
private:
// helper for combining partition consumer arrays of scalar children
static CPartInfo *PpartinfoDeriveCombineScalar(CMemoryPool *mp,
CExpressionHandle &exprhdl);
protected:
// perform conjunction of child boolean evaluation results
static EBoolEvalResult EberConjunction(ULongPtrArray *pdrgpulChildren);
// perform disjunction of child boolean evaluation results
static EBoolEvalResult EberDisjunction(ULongPtrArray *pdrgpulChildren);
// return Null if any child is Null
static EBoolEvalResult EberNullOnAnyNullChild(
ULongPtrArray *pdrgpulChildren);
// return Null if all children are Null
static EBoolEvalResult EberNullOnAllNullChildren(
ULongPtrArray *pdrgpulChildren);
public:
CScalar(const CScalar &) = delete;
// ctor
explicit CScalar(CMemoryPool *mp) : COperator(mp)
{
}
// dtor
~CScalar() override = default;
// type of operator
BOOL
FScalar() const override
{
GPOS_ASSERT(!FPhysical() && !FLogical() && !FPattern());
return true;
}
// create derived properties container
CDrvdProp *PdpCreate(CMemoryPool *mp) const override;
// create required properties container
CReqdProp *PrpCreate(CMemoryPool *mp) const override;
// return locally defined columns
virtual CColRefSet *
PcrsDefined(CMemoryPool *mp,
CExpressionHandle & // exprhdl
)
{
// return an empty set of column refs
return GPOS_NEW(mp) CColRefSet(mp);
}
// return columns containing set-returning function
virtual CColRefSet *
PcrsSetReturningFunction(CMemoryPool *mp,
CExpressionHandle & // exprhdl
)
{
// return an empty set of column refs
return GPOS_NEW(mp) CColRefSet(mp);
}
// return locally used columns
virtual CColRefSet *
PcrsUsed(CMemoryPool *mp,
CExpressionHandle & // exprhdl
)
{
// return an empty set of column refs
return GPOS_NEW(mp) CColRefSet(mp);
}
// derive partition consumer info
virtual CPartInfo *
PpartinfoDerive(CMemoryPool *mp, CExpressionHandle &exprhdl) const
{
return PpartinfoDeriveCombineScalar(mp, exprhdl);
}
// derive function properties
virtual CFunctionProp *
DeriveFunctionProperties(CMemoryPool *mp, CExpressionHandle &exprhdl) const
{
return PfpDeriveFromChildren(mp, exprhdl,
IMDFunction::EfsImmutable, // efdaDefault
false, // fHasVolatileFunctionScan
false // fScan
);
}
// derive subquery existence
virtual BOOL FHasSubquery(CExpressionHandle &exprhdl);
// derive non-scalar function existence
virtual BOOL FHasNonScalarFunction(CExpressionHandle &exprhdl);
virtual BOOL FHasScalarArrayCmp(CExpressionHandle &exprhdl);
// boolean expression evaluation
virtual EBoolEvalResult
Eber(ULongPtrArray * // pdrgpulChildren
) const
{
// by default, evaluation result can be false, true or NULL
return EberAny;
}
// perform boolean evaluation of the given expression tree
static EBoolEvalResult EberEvaluate(CMemoryPool *mp,
CExpression *pexprScalar);
// conversion function
static CScalar *
PopConvert(COperator *pop)
{
GPOS_ASSERT(nullptr != pop);
GPOS_ASSERT(pop->FScalar());
return dynamic_cast<CScalar *>(pop);
}
// the type of the scalar expression
virtual IMDId *MdidType() const = 0;
// the type modifier of the scalar expression
virtual INT
TypeModifier() const
{
return default_type_modifier;
}
}; // class CScalar
} // namespace gpopt
#endif // !GPOPT_CScalar_H
// EOF
相关信息
相关文章
greenplumn CExpressionFactorizer 源码
greenplumn CExpressionHandle 源码
greenplumn CExpressionPreprocessor 源码
greenplumn CExpressionUtils 源码
0
赞
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
7、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦