greenplumn CXform 源码

  • 2022-08-18
  • 浏览 (375)

greenplumn CXform 代码

文件路径:/src/backend/gporca/libgpopt/src/xforms/CXform.cpp

//---------------------------------------------------------------------------
//	Greenplum Database
//	Copyright (C) 2009 Greenplum, Inc.
//
//	@filename:
//		CXform.cpp
//
//	@doc:
//		Base class for all transformations
//---------------------------------------------------------------------------

#include "gpopt/xforms/CXform.h"

#include "gpos/base.h"

#include "gpopt/operators/CExpressionHandle.h"


using namespace gpopt;

FORCE_GENERATE_DBGSTR(CXform);

//---------------------------------------------------------------------------
//	@function:
//		CXform::CXform
//
//	@doc:
//		ctor
//
//---------------------------------------------------------------------------
CXform::CXform(CExpression *pexpr) : m_pexpr(pexpr)
{
	GPOS_ASSERT(nullptr != pexpr);
	GPOS_ASSERT(FCheckPattern(pexpr));
}


//---------------------------------------------------------------------------
//	@function:
//		CXform::~CXform
//
//	@doc:
//		dtor
//
//---------------------------------------------------------------------------
CXform::~CXform()
{
	m_pexpr->Release();
}


//---------------------------------------------------------------------------
//	@function:
//		CXform::OsPrint
//
//	@doc:
//		debug print
//
//---------------------------------------------------------------------------
IOstream &
CXform::OsPrint(IOstream &os) const
{
	os << "Xform: " << SzId();

	if (GPOS_FTRACE(EopttracePrintXformPattern))
	{
		os << std::endl << "Pattern:" << std::endl << *m_pexpr;
	}

	return os;
}


#ifdef GPOS_DEBUG

//---------------------------------------------------------------------------
//	@function:
//		CXform::FCheckPattern
//
//	@doc:
//		check a given expression against the pattern
//
//---------------------------------------------------------------------------
BOOL
CXform::FCheckPattern(CExpression *pexpr) const
{
	return pexpr->FMatchPattern(PexprPattern());
}


//---------------------------------------------------------------------------
//	@function:
//		CXform::FPromising
//
//	@doc:
//		Verify xform promise for the given expression
//
//---------------------------------------------------------------------------
BOOL
CXform::FPromising(CMemoryPool *mp, const CXform *pxform, CExpression *pexpr)
{
	GPOS_ASSERT(nullptr != pxform);
	GPOS_ASSERT(nullptr != pexpr);

	CExpressionHandle exprhdl(mp);
	exprhdl.Attach(pexpr);
	exprhdl.DeriveProps(nullptr /*pdpctxt*/);

	return ExfpNone < pxform->Exfp(exprhdl);
}

#endif	// GPOS_DEBUG


//---------------------------------------------------------------------------
//	@function:
//		CXform::FEqualIds
//
//	@doc:
//		Equality function on xform ids
//
//---------------------------------------------------------------------------
BOOL
CXform::FEqualIds(const CHAR *szIdOne, const CHAR *szIdTwo)
{
	return 0 == clib::Strcmp(szIdOne, szIdTwo);
}

//---------------------------------------------------------------------------
//	@function:
//		CXform::PbsNLJoinXforms
//
//	@doc:
//		Returns a set containing all xforms related to nestloop join.
//		Caller takes ownership of the returned set
//
//---------------------------------------------------------------------------
CBitSet *
CXform::PbsNLJoinXforms(CMemoryPool *mp)
{
	CBitSet *pbs = GPOS_NEW(mp) CBitSet(mp, EopttraceSentinel);
	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfInnerJoin2NLJoin));
	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfLeftOuterJoin2NLJoin));
	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfLeftSemiJoin2NLJoin));
	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfLeftAntiSemiJoin2NLJoin));
	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfLeftAntiSemiJoinNotIn2NLJoinNotIn));

	return pbs;
}

//---------------------------------------------------------------------------
//	@function:
//		CXform::PbsIndexJoinXforms
//
//	@doc:
//		Returns a set containing all xforms related to index join.
//		Caller takes ownership of the returned set
//
//---------------------------------------------------------------------------
CBitSet *
CXform::PbsIndexJoinXforms(CMemoryPool *mp)
{
	CBitSet *pbs = GPOS_NEW(mp) CBitSet(mp, EopttraceSentinel);
	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfJoin2BitmapIndexGetApply));
	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfJoin2IndexGetApply));

	return pbs;
}

//---------------------------------------------------------------------------
//	@function:
//		CXform::PbsBitmapIndexXforms
//
//	@doc:
//		Returns a set containing all xforms related to bitmap indexes.
//		Caller takes ownership of the returned set
//
//---------------------------------------------------------------------------
CBitSet *
CXform::PbsBitmapIndexXforms(CMemoryPool *mp)
{
	CBitSet *pbs = GPOS_NEW(mp) CBitSet(mp, EopttraceSentinel);
	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfSelect2BitmapBoolOp));
	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfSelect2DynamicBitmapBoolOp));
	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfJoin2BitmapIndexGetApply));

	return pbs;
}

//	returns a set containing all xforms that generate a plan with hash join
//	Caller takes ownership of the returned set
CBitSet *
CXform::PbsHashJoinXforms(CMemoryPool *mp)
{
	CBitSet *pbs = GPOS_NEW(mp) CBitSet(mp, EopttraceSentinel);

	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfInnerJoin2HashJoin));
	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfLeftOuterJoin2HashJoin));
	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfLeftSemiJoin2HashJoin));
	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfLeftAntiSemiJoin2HashJoin));
	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfLeftAntiSemiJoinNotIn2HashJoinNotIn));
	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfRightOuterJoin2HashJoin));
	(void) pbs->ExchangeSet(GPOPT_DISABLE_XFORM_TF(
		CXform::
			ExfLeftJoin2RightJoin));  // Right joins are only used with hash joins, so disable this too
	return pbs;
}

CBitSet *
CXform::PbsJoinOrderInQueryXforms(CMemoryPool *mp)
{
	CBitSet *pbs = GPOS_NEW(mp) CBitSet(mp, EopttraceSentinel);

	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfExpandNAryJoinDP));
	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfExpandNAryJoinDPv2));
	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfExpandNAryJoinMinCard));
	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfJoinAssociativity));
	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfJoinCommutativity));
	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfExpandNAryJoinGreedy));

	return pbs;
}

CBitSet *
CXform::PbsJoinOrderOnGreedyXforms(CMemoryPool *mp)
{
	CBitSet *pbs = GPOS_NEW(mp) CBitSet(mp, EopttraceSentinel);

	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfExpandNAryJoinDP));
	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfExpandNAryJoinDPv2));
	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfJoinAssociativity));
	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfJoinCommutativity));

	return pbs;
}

CBitSet *
CXform::PbsJoinOrderOnExhaustiveXforms(CMemoryPool *mp)
{
	CBitSet *pbs = GPOS_NEW(mp) CBitSet(mp, EopttraceSentinel);

	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfExpandNAryJoinDPv2));

	return pbs;
}

CBitSet *
CXform::PbsJoinOrderOnExhaustive2Xforms(CMemoryPool *mp)
{
	CBitSet *pbs = GPOS_NEW(mp) CBitSet(mp, EopttraceSentinel);

	(void) pbs->ExchangeSet(GPOPT_DISABLE_XFORM_TF(CXform::ExfExpandNAryJoin));
	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfExpandNAryJoinDP));
	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfExpandNAryJoinMinCard));
	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfExpandNAryJoinGreedy));
	(void) pbs->ExchangeSet(
		GPOPT_DISABLE_XFORM_TF(CXform::ExfPushDownLeftOuterJoin));
	(void) pbs->ExchangeSet(EopttraceEnableLOJInNAryJoin);

	return pbs;
}

BOOL
CXform::IsApplyOnce()
{
	return false;
}
// EOF

相关信息

greenplumn 源码目录

相关文章

greenplumn CDecorrelator 源码

greenplumn CJoinOrder 源码

greenplumn CJoinOrderDP 源码

greenplumn CJoinOrderDPv2 源码

greenplumn CJoinOrderGreedy 源码

greenplumn CJoinOrderMinCard 源码

greenplumn CSubqueryHandler 源码

greenplumn CXformCTEAnchor2Sequence 源码

greenplumn CXformCTEAnchor2TrivialSelect 源码

greenplumn CXformCollapseGbAgg 源码

0  赞