COptCtxt.cpp 4.2 KB
Newer Older
E
Entong Shen 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
//---------------------------------------------------------------------------
//	Greenplum Database
//	Copyright (C) 2009 Greenplum, Inc.
//
//	@filename:
//		COptCtxt.cpp
//
//	@doc:
//		Implementation of optimizer context
//---------------------------------------------------------------------------

#include "gpos/base.h"
#include "gpos/common/CAutoP.h"

#include "naucrates/traceflags/traceflags.h"
#include "gpopt/base/CColRefSet.h"
#include "gpopt/base/CDefaultComparator.h"
#include "gpopt/base/COptCtxt.h"
#include "gpopt/cost/ICostModel.h"
#include "gpopt/eval/IConstExprEvaluator.h"
#include "gpopt/optimizer/COptimizerConfig.h"

using namespace gpopt;

// value of the first value part id
ULONG COptCtxt::m_ulFirstValidPartId = 1;

//---------------------------------------------------------------------------
//	@function:
//		COptCtxt::COptCtxt
//
//	@doc:
//		ctor
//
//---------------------------------------------------------------------------
J
Jesse Zhang 已提交
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
COptCtxt::COptCtxt(CMemoryPool *mp, CColumnFactory *col_factory,
				   CMDAccessor *md_accessor, IConstExprEvaluator *pceeval,
				   COptimizerConfig *optimizer_config)
	: CTaskLocalStorageObject(CTaskLocalStorage::EtlsidxOptCtxt),
	  m_mp(mp),
	  m_pcf(col_factory),
	  m_pmda(md_accessor),
	  m_pceeval(pceeval),
	  m_pcomp(GPOS_NEW(m_mp) CDefaultComparator(pceeval)),
	  m_auPartId(m_ulFirstValidPartId),
	  m_pcteinfo(NULL),
	  m_pdrgpcrSystemCols(NULL),
	  m_optimizer_config(optimizer_config),
	  m_fDMLQuery(false),
	  m_has_master_only_tables(false),
	  m_has_volatile_or_SQL_func(false),
	  m_has_replicated_tables(false)
E
Entong Shen 已提交
53
{
54 55 56
	GPOS_ASSERT(NULL != mp);
	GPOS_ASSERT(NULL != col_factory);
	GPOS_ASSERT(NULL != md_accessor);
E
Entong Shen 已提交
57 58
	GPOS_ASSERT(NULL != pceeval);
	GPOS_ASSERT(NULL != m_pcomp);
59 60
	GPOS_ASSERT(NULL != optimizer_config);
	GPOS_ASSERT(NULL != optimizer_config->GetCostModel());
J
Jesse Zhang 已提交
61

62 63
	m_pcteinfo = GPOS_NEW(m_mp) CCTEInfo(m_mp);
	m_cost_model = optimizer_config->GetCostModel();
64
	m_direct_dispatchable_filters = GPOS_NEW(mp) CExpressionArray(mp);
E
Entong Shen 已提交
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
}


//---------------------------------------------------------------------------
//	@function:
//		COptCtxt::~COptCtxt
//
//	@doc:
//		dtor
//		Does not de-allocate memory pool!
//
//---------------------------------------------------------------------------
COptCtxt::~COptCtxt()
{
	GPOS_DELETE(m_pcf);
	GPOS_DELETE(m_pcomp);
	m_pceeval->Release();
	m_pcteinfo->Release();
83
	m_optimizer_config->Release();
E
Entong Shen 已提交
84
	CRefCount::SafeRelease(m_pdrgpcrSystemCols);
85
	CRefCount::SafeRelease(m_direct_dispatchable_filters);
E
Entong Shen 已提交
86 87 88 89 90 91 92 93 94 95 96 97
}


//---------------------------------------------------------------------------
//	@function:
//		COptCtxt::PoctxtCreate
//
//	@doc:
//		Factory method for optimizer context
//
//---------------------------------------------------------------------------
COptCtxt *
J
Jesse Zhang 已提交
98 99 100
COptCtxt::PoctxtCreate(CMemoryPool *mp, CMDAccessor *md_accessor,
					   IConstExprEvaluator *pceeval,
					   COptimizerConfig *optimizer_config)
E
Entong Shen 已提交
101
{
102
	GPOS_ASSERT(NULL != optimizer_config);
E
Entong Shen 已提交
103 104 105

	// CONSIDER:  - 1/5/09; allocate column factory out of given mem pool
	// instead of having it create its own;
106
	CColumnFactory *col_factory = GPOS_NEW(mp) CColumnFactory;
E
Entong Shen 已提交
107 108 109 110 111 112

	COptCtxt *poctxt = NULL;
	{
		// safe handling of column factory; since it owns a pool that would be
		// leaked if below allocation fails
		CAutoP<CColumnFactory> a_pcf;
113 114
		a_pcf = col_factory;
		a_pcf.Value()->Initialize();
E
Entong Shen 已提交
115

J
Jesse Zhang 已提交
116 117
		poctxt = GPOS_NEW(mp)
			COptCtxt(mp, col_factory, md_accessor, pceeval, optimizer_config);
E
Entong Shen 已提交
118 119

		// detach safety
120
		(void) a_pcf.Reset();
E
Entong Shen 已提交
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
	}
	return poctxt;
}


//---------------------------------------------------------------------------
//	@function:
//		COptCtxt::FAllEnforcersEnabled
//
//	@doc:
//		Return true if all enforcers are enabled
//
//---------------------------------------------------------------------------
BOOL
COptCtxt::FAllEnforcersEnabled()
{
	BOOL fEnforcerDisabled =
		GPOS_FTRACE(EopttraceDisableMotions) ||
		GPOS_FTRACE(EopttraceDisableMotionBroadcast) ||
		GPOS_FTRACE(EopttraceDisableMotionGather) ||
		GPOS_FTRACE(EopttraceDisableMotionHashDistribute) ||
		GPOS_FTRACE(EopttraceDisableMotionRandom) ||
		GPOS_FTRACE(EopttraceDisableMotionRountedDistribute) ||
		GPOS_FTRACE(EopttraceDisableSort) ||
		GPOS_FTRACE(EopttraceDisableSpool) ||
		GPOS_FTRACE(EopttraceDisablePartPropagation);

	return !fEnforcerDisabled;
}