greenplumn CMDAccessorUtils 代码
文件路径:/src/backend/gporca/libgpopt/include/gpopt/mdcache/CMDAccessorUtils.h
/---------------------------------------------------------------------------
/ Greenplum Database
/ Copyright (C) 2012 EMC Corp.
/
/ @filename:
/ CMDAccessorUtils.h
/
/ @doc:
/ Utility functions associated with the metadata cache accessor
/---------------------------------------------------------------------------
#ifndef GPOPT_CMDAccessorUtils_H
#define GPOPT_CMDAccessorUtils_H
#include "gpopt/mdcache/CMDAccessor.h"
#include "gpopt/operators/CExpression.h"
namespace gpopt
{
using namespace gpos;
using namespace gpmd;
/---------------------------------------------------------------------------
/ @class:
/ CMDAccessorUtils
/
/ @doc:
/ Utility functions associated with the metadata cache accessor
/
/---------------------------------------------------------------------------
class CMDAccessorUtils
{
public:
/ return the name of the window operation
static const CWStringConst *PstrWindowFuncName(CMDAccessor *md_accessor,
IMDId *mdid);
/ return the return type of the window operation
static IMDId *PmdidWindowReturnType(CMDAccessor *md_accessor, IMDId *mdid);
/ does a cast object between given source and destination types exist
static BOOL FCastExists(CMDAccessor *md_accessor, IMDId *mdid_src,
IMDId *mdid_dest);
/ does a scalar comparison object between given types exist
static BOOL FCmpExists(CMDAccessor *md_accessor, IMDId *left_mdid,
IMDId *right_mdid, IMDType::ECmpType cmp_type);
/ get scalar comparison mdid between the given types
static IMDId *GetScCmpMdid(CMDAccessor *md_accessor, IMDId *left_mdid,
IMDId *right_mdid, IMDType::ECmpType cmp_type);
/ check is a comparison between given types or a comparison after casting
/ one side to an another exists
static BOOL FCmpOrCastedCmpExists(IMDId *left_mdid, IMDId *right_mdid,
IMDType::ECmpType cmp_type);
/ return the mdid of the given scalar comparison between the two types
/ also considering casts
static IMDId *GetScCmpMdIdConsiderCasts(CMDAccessor *md_accessor,
IMDId *left_mdid, IMDId *right_mdid,
IMDType::ECmpType cmp_type);
static IMDId *GetScCmpMdIdConsiderCasts(CMDAccessor *md_accessor,
CExpression *pexprLeft,
CExpression *pexprRight,
IMDType::ECmpType cmp_type);
/ similar to GetScCmpMdIdConsiderCasts() but also add the appropriate casts
static void ApplyCastsForScCmp(CMemoryPool *mp, CMDAccessor *md_accessor,
CExpression *&pexprLeft,
CExpression *&pexprRight, IMDId *op_mdid);
/ is scalar operator commutative? this can be used with ScalarOp and ScalarCmp
static BOOL FCommutativeScalarOp(CMDAccessor *md_accessor, IMDId *mdid_op);
/ does scalar operator return NULL on NULL input?
static BOOL FScalarOpReturnsNullOnNullInput(CMDAccessor *md_accessor,
IMDId *mdid_op);
/ return True if passed mdid is for BOOL type
static BOOL FBoolType(CMDAccessor *md_accessor, IMDId *mdid_type);
};
} / namespace gpopt
#endif / !GPOPT_CMDAccessorUtils_H
/ EOF