本文整理汇总了C++中CExpression::Release方法的典型用法代码示例。如果您正苦于以下问题:C++ CExpression::Release方法的具体用法?C++ CExpression::Release怎么用?C++ CExpression::Release使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CExpression
的用法示例。
在下文中一共展示了CExpression::Release方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: DrgPexpr
//---------------------------------------------------------------------------
// @function:
// CNormalizer::PexprNormalize
//
// @doc:
// Main driver
//
//---------------------------------------------------------------------------
CExpression *
CNormalizer::PexprNormalize
(
IMemoryPool *pmp,
CExpression *pexpr
)
{
GPOS_CHECK_STACK_SIZE;
GPOS_ASSERT(NULL != pexpr);
if (0 == pexpr->UlArity())
{
// end recursion early for leaf patterns extracted from memo
pexpr->AddRef();
return pexpr;
}
CExpression *pexprResult = NULL;
COperator *pop = pexpr->Pop();
if (pop->FLogical() && CLogical::PopConvert(pop)->FSelectionOp())
{
if (FPushThruOuterChild(pexpr))
{
CExpression *pexprConstTrue = CUtils::PexprScalarConstBool(pmp, true /*fVal*/);
PushThru(pmp, pexpr, pexprConstTrue, &pexprResult);
pexprConstTrue->Release();
}
else
{
// add-ref all children except scalar predicate
const ULONG ulArity = pexpr->UlArity();
DrgPexpr *pdrgpexpr = GPOS_NEW(pmp) DrgPexpr(pmp);
for (ULONG ul = 0; ul < ulArity - 1; ul++)
{
CExpression *pexprChild = (*pexpr)[ul];
pexprChild->AddRef();
pdrgpexpr->Append(pexprChild);
}
// normalize scalar predicate and construct a new expression
CExpression *pexprPred = (*pexpr)[pexpr->UlArity() - 1];
CExpression *pexprPredNormalized = PexprRecursiveNormalize(pmp, pexprPred);
pdrgpexpr->Append(pexprPredNormalized);
COperator *pop = pexpr->Pop();
pop->AddRef();
CExpression *pexprNew = GPOS_NEW(pmp) CExpression(pmp, pop, pdrgpexpr);
// push normalized predicate through
PushThru(pmp, pexprNew, pexprPredNormalized, &pexprResult);
pexprNew->Release();
}
}
else
{
pexprResult = PexprRecursiveNormalize(pmp, pexpr);
}
GPOS_ASSERT(NULL != pexprResult);
return pexprResult;
}
示例2: CColRefSet
//---------------------------------------------------------------------------
// @function:
// CNormalizer::PushThruSetOp
//
// @doc:
// Push a conjunct through set operation
//
//---------------------------------------------------------------------------
void
CNormalizer::PushThruSetOp
(
IMemoryPool *pmp,
CExpression *pexprSetOp,
CExpression *pexprConj,
CExpression **ppexprResult
)
{
GPOS_ASSERT(NULL != pexprSetOp);
GPOS_ASSERT(CUtils::FLogicalSetOp(pexprSetOp->Pop()));
GPOS_ASSERT(NULL != pexprConj);
GPOS_ASSERT(NULL != ppexprResult);
CLogicalSetOp *popSetOp = CLogicalSetOp::PopConvert(pexprSetOp->Pop());
DrgPcr *pdrgpcrOutput = popSetOp->PdrgpcrOutput();
CColRefSet *pcrsOutput = GPOS_NEW(pmp) CColRefSet(pmp, pdrgpcrOutput);
DrgDrgPcr *pdrgpdrgpcrInput = popSetOp->PdrgpdrgpcrInput();
DrgPexpr *pdrgpexprNewChildren = GPOS_NEW(pmp) DrgPexpr(pmp);
const ULONG ulArity = pexprSetOp->UlArity();
for (ULONG ul = 0; ul < ulArity; ul++)
{
CExpression *pexprChild = (*pexprSetOp)[ul];
DrgPcr *pdrgpcrChild = (*pdrgpdrgpcrInput)[ul];
CColRefSet *pcrsChild = GPOS_NEW(pmp) CColRefSet(pmp, pdrgpcrChild);
pexprConj->AddRef();
CExpression *pexprRemappedConj = pexprConj;
if (!pcrsChild->FEqual(pcrsOutput))
{
// child columns are different from SetOp output columns,
// we need to fix conjunct by mapping output columns to child columns,
// columns that are not in the output of SetOp child need also to be re-mapped
// to new columns,
//
// for example, if the conjunct looks like 'x > (select max(y) from T)'
// and the SetOp child produces only column x, we need to create a new
// conjunct that looks like 'x1 > (select max(y1) from T)'
// where x1 is a copy of x, and y1 is a copy of y
//
// this is achieved by passing (fMustExist = True) flag below, which enforces
// creating column copies for columns not already in the given map
HMUlCr *phmulcr = CUtils::PhmulcrMapping(pmp, pdrgpcrOutput, pdrgpcrChild);
pexprRemappedConj->Release();
pexprRemappedConj = pexprConj->PexprCopyWithRemappedColumns(pmp, phmulcr, true /*fMustExist*/);
phmulcr->Release();
}
CExpression *pexprNewChild = NULL;
PushThru(pmp, pexprChild, pexprRemappedConj, &pexprNewChild);
pdrgpexprNewChildren->Append(pexprNewChild);
pexprRemappedConj->Release();
pcrsChild->Release();
}
pcrsOutput->Release();
popSetOp->AddRef();
*ppexprResult = GPOS_NEW(pmp) CExpression(pmp, popSetOp, pdrgpexprNewChildren);
}
示例3: mda
//---------------------------------------------------------------------------
// @function:
// CCNFConverterTest::EresUnittest_Basic
//
// @doc:
// Basic test
//
//---------------------------------------------------------------------------
GPOS_RESULT
CCNFConverterTest::EresUnittest_Basic()
{
CAutoMemoryPool amp;
IMemoryPool *pmp = amp.Pmp();
// setup a file-based provider
CMDProviderMemory *pmdp = CTestUtils::m_pmdpf;
pmdp->AddRef();
CMDAccessor mda(pmp, CMDCache::Pcache(), CTestUtils::m_sysidDefault, pmdp);
typedef CExpression *(*Pfpexpr)(IMemoryPool*);
Pfpexpr rgpf[] =
{
CTestUtils::PexprLogicalSelectWithNestedAnd,
CTestUtils::PexprLogicalSelectWithNestedOr,
CTestUtils::PexprLogicalSelectWithEvenNestedNot,
CTestUtils::PexprLogicalSelectWithOddNestedNot,
CTestUtils::PexprLogicalSelectWithNestedAndOrNot
};
for (ULONG i = 0; i < GPOS_ARRAY_SIZE(rgpf); i++)
{
// install opt context in TLS
CAutoOptCtxt aoc
(
pmp,
&mda,
NULL, /* pceeval */
CTestUtils::Pcm(pmp)
);
// generate expression
CExpression *pexpr = rgpf[i](pmp);
CExpression *pexprPreprocessed = CExpressionPreprocessor::PexprPreprocess(pmp, pexpr);
CWStringDynamic str(pmp);
COstreamString oss(&str);
oss << std::endl << "SCALAR EXPR:" << std::endl << *(*pexpr)[1] << std::endl;
GPOS_TRACE(str.Wsz());
str.Reset();
if (1 < pexprPreprocessed->UlArity())
{
CExpression *pexprCNF = CCNFConverter::Pexpr2CNF(pmp, (*pexprPreprocessed)[1]);
oss << std::endl << "CNF REPRESENTATION:" << std::endl << *pexprCNF << std::endl;
GPOS_TRACE(str.Wsz());
str.Reset();
pexprCNF->Release();
}
pexpr->Release();
pexprPreprocessed->Release();
}
return GPOS_OK;
}
示例4: dRowsExpected
// test cardinality for predicates of the form: a + c = b
// for such predicates, NDV based cardinality estimation is not applicable
GPOS_RESULT
CJoinCardinalityNDVBasedEqPredTest::EresUnittest_NDVCardEstimationNotApplicableMultipleIdents()
{
// cartesian product / 2.5
// 2.5 = 1/.4 -- where .4 is default selectivity
CDouble dRowsExpected(76004000);
Fixture f(file_name);
IMemoryPool *mp = f.Pmp();
IStatisticsArray *statistics_array = f.PdrgPstat();
CExpression *pexprLgGet = CTestUtils::PexprLogicalGet(mp);
CLogicalGet *popGet = CLogicalGet::PopConvert(pexprLgGet->Pop());
CColRefArray *colref_array = popGet->PdrgpcrOutput();
// use the colid available in the input xml file
CColRef *pcrLeft1 = (*colref_array)[2];
CColRef *pcrLeft2 = (*colref_array)[1];
CColRef *pcrRight = (*colref_array)[0];
// create a scalar ident
// CScalarIdent "column_0000" (0)
CExpression *pexprScalarIdentRight = CUtils::PexprScalarIdent(mp, pcrRight);
CExpression *pexprScalarIdentLeft2 = CUtils::PexprScalarIdent(mp, pcrLeft2);
// create a scalar op expression column_0002 + column_0001
// CScalarOp (+)
// |--CScalarIdent "column_0002" (2)
// +--CScalarIdent "column_0001" (1)
CExpression *pexprScOp = CUtils::PexprScalarOp(mp, pcrLeft1, pexprScalarIdentLeft2,
CWStringConst(GPOS_WSZ_LIT("+")),
GPOS_NEW(mp) CMDIdGPDB(GPDB_INT4_ADD_OP));
// create a scalar comparision operator
// +--CScalarCmp (=)
// |--CScalarOp (+)
// | |--CScalarIdent "column_0002" (2)
// | +--CScalarIdent "column_0001" (1)
// +--CScalarIdent "column_0000" (0)
CExpression *pScalarCmp = CUtils::PexprScalarEqCmp(mp, pexprScOp, pexprScalarIdentRight);
IStatistics *join_stats = CJoinStatsProcessor::CalcAllJoinStats(mp, statistics_array, pScalarCmp,
IStatistics::EsjtInnerJoin);
GPOS_ASSERT(NULL != join_stats);
CDouble dRowsActual(join_stats->Rows());
GPOS_RESULT eres = GPOS_OK;
if (floor(dRowsActual.Get()) != dRowsExpected)
{
eres = GPOS_FAILED;
}
join_stats->Release();
pexprLgGet->Release();
pScalarCmp->Release();
return eres;
}
示例5:
//---------------------------------------------------------------------------
// @function:
// CNormalizer::PushThruSelect
//
// @doc:
// Push a conjunct through a select
//
//---------------------------------------------------------------------------
void
CNormalizer::PushThruSelect
(
IMemoryPool *pmp,
CExpression *pexprSelect,
CExpression *pexprConj,
CExpression **ppexprResult
)
{
GPOS_ASSERT(NULL != pexprConj);
GPOS_ASSERT(NULL != ppexprResult);
CExpression *pexprLogicalChild = (*pexprSelect)[0];
CExpression *pexprScalarChild = (*pexprSelect)[1];
CExpression *pexprPred = CPredicateUtils::PexprConjunction(pmp, pexprScalarChild, pexprConj);
if (CUtils::FScalarConstTrue(pexprPred))
{
pexprPred->Release();
*ppexprResult = PexprNormalize(pmp, pexprLogicalChild);
return;
}
COperator::EOperatorId eopid = pexprLogicalChild->Pop()->Eopid();
if (COperator::EopLogicalLeftOuterJoin == eopid)
{
CExpression *pexprSimplified = NULL;
if (FSimplifySelectOnOuterJoin(pmp, pexprLogicalChild, pexprPred, &pexprSimplified))
{
// simplification succeeded, normalize resulting expression
*ppexprResult = PexprNormalize(pmp, pexprSimplified);
pexprPred->Release();
pexprSimplified->Release();
return;
}
}
if (FPushThruOuterChild(pexprLogicalChild))
{
PushThruOuterChild(pmp, pexprLogicalChild, pexprPred, ppexprResult);
}
else
{
// logical child may not pass all predicates through, we need to collect
// unpushable predicates, if any, into a top Select node
DrgPexpr *pdrgpexprConjuncts = CPredicateUtils::PdrgpexprConjuncts(pmp, pexprPred);
DrgPexpr *pdrgpexprRemaining = NULL;
CExpression *pexpr = NULL;
PushThru(pmp, pexprLogicalChild, pdrgpexprConjuncts, &pexpr, &pdrgpexprRemaining);
*ppexprResult = PexprSelect(pmp, pexpr, pdrgpexprRemaining);
pdrgpexprConjuncts->Release();
}
pexprPred->Release();
}
示例6: PexprNormalize
//---------------------------------------------------------------------------
// @function:
// CNormalizer::PexprSelect
//
// @doc:
// Return a Select expression, if needed, with a scalar condition made of
// given array of conjuncts
//
//---------------------------------------------------------------------------
CExpression *
CNormalizer::PexprSelect
(
IMemoryPool *pmp,
CExpression *pexpr,
DrgPexpr *pdrgpexpr
)
{
GPOS_ASSERT(NULL != pexpr);
GPOS_ASSERT(NULL != pdrgpexpr);
if (0 == pdrgpexpr->UlLength())
{
// no predicate, return given expression
pdrgpexpr->Release();
return pexpr;
}
// result expression is a select over predicates
CExpression *pexprConjunction = CPredicateUtils::PexprConjunction(pmp, pdrgpexpr);
CExpression *pexprSelect = CUtils::PexprSafeSelect(pmp, pexpr, pexprConjunction);
if (COperator::EopLogicalSelect != pexprSelect->Pop()->Eopid())
{
// Select node was pruned, return created expression
return pexprSelect;
}
CExpression *pexprLogicalChild = (*pexprSelect)[0];
COperator::EOperatorId eopidChild = pexprLogicalChild->Pop()->Eopid();
if (COperator::EopLogicalLeftOuterJoin != eopidChild)
{
// child of Select is not an outer join, return created Select expression
return pexprSelect;
}
// we have a Select on top of Outer Join expression, attempt simplifying expression into InnerJoin
CExpression *pexprSimplified = NULL;
if (FSimplifySelectOnOuterJoin(pmp, pexprLogicalChild, (*pexprSelect)[1], &pexprSimplified))
{
// simplification succeeded, normalize resulting expression
pexprSelect->Release();
CExpression *pexprResult = PexprNormalize(pmp, pexprSimplified);
pexprSimplified->Release();
return pexprResult;
}
// simplification failed, return created Select expression
return pexprSelect;
}
示例7:
//---------------------------------------------------------------------------
// @function:
// CXformExpandNAryJoin::AddSpecifiedJoinOrder
//
// @doc:
// Expand NAry join in the specified order of inputs
//
//---------------------------------------------------------------------------
void
CXformExpandNAryJoin::AddSpecifiedJoinOrder
(
IMemoryPool *pmp,
CExpression *pexpr,
CXformResult *pxfres
)
{
GPOS_ASSERT(COperator::EopLogicalNAryJoin == pexpr->Pop()->Eopid());
const ULONG ulArity = pexpr->UlArity();
if (4 > ulArity)
{
return;
}
// create a join order with same order of given relations
(*pexpr)[0]->AddRef();
(*pexpr)[1]->AddRef();
CExpression *pexprJoin = CUtils::PexprLogicalJoin<CLogicalInnerJoin>(pmp, (*pexpr)[0], (*pexpr)[1], CPredicateUtils::PexprConjunction(pmp, NULL));
for (ULONG ul = 2; ul < ulArity - 1; ul++)
{
(*pexpr)[ul]->AddRef();
pexprJoin = CUtils::PexprLogicalJoin<CLogicalInnerJoin>(pmp, pexprJoin, (*pexpr)[ul], CPredicateUtils::PexprConjunction(pmp, NULL));
}
CExpression *pexprScalar = (*pexpr)[ulArity - 1];
pexprScalar->AddRef();
CExpression *pexprSelect = CUtils::PexprLogicalSelect(pmp, pexprJoin, pexprScalar);
CExpression *pexprNormalized = CNormalizer::PexprNormalize(pmp, pexprSelect);
pexprSelect->Release();
pxfres->Add(pexprNormalized);
}
示例8: PexprTransform
//---------------------------------------------------------------------------
// @function:
// CXformGbAggWithMDQA2Join::PexprExpandMDQAs
//
// @doc:
// Expand GbAgg with multiple distinct aggregates into a join of single
// distinct aggregates,
// return NULL if expansion is not done
//
//---------------------------------------------------------------------------
CExpression *
CXformGbAggWithMDQA2Join::PexprExpandMDQAs
(
IMemoryPool *pmp,
CExpression *pexpr
)
{
GPOS_ASSERT(NULL != pexpr);
GPOS_ASSERT(COperator::EopLogicalGbAgg == pexpr->Pop()->Eopid());
COperator *pop = pexpr->Pop();
if (CLogicalGbAgg::PopConvert(pop)->FGlobal())
{
BOOL fHasMultipleDistinctAggs = CDrvdPropScalar::Pdpscalar((*pexpr)[1]->PdpDerive())->FHasMultipleDistinctAggs();
if (fHasMultipleDistinctAggs)
{
CExpression *pexprExpanded = PexprMDQAs2Join(pmp, pexpr);
// recursively process the resulting expression
CExpression *pexprResult = PexprTransform(pmp, pexprExpanded);
pexprExpanded->Release();
return pexprResult;
}
}
return NULL;
}
示例9: GetValue
CValue* CParser::GetValue(STR_String& txt, bool bFallbackToText)
{
// returns parsed text into a value,
// empty string returns NULL value !
// if bFallbackToText then unparsed stuff is put into text
CValue* result=NULL;
CExpression* expr = ProcessText(txt);
if (expr) {
result = expr->Calculate();
expr->Release();
}
if (result)
{
// if the parsed stuff lead to an errorvalue, don't return errors, just NULL
if (result->IsError()) {
result->Release();
result=NULL;
if (bFallbackToText) {
if (txt.Length()>0)
{
result = new CStringValue(txt,"");
}
}
}
}
return result;
}
示例10: PexprPullUpAndCombineProjects
//---------------------------------------------------------------------------
// @function:
// CNormalizer::PexprPullUpProjections
//
// @doc:
// Pulls up logical projects as far as possible, and combines consecutive
// projects if possible
//
//---------------------------------------------------------------------------
CExpression *
CNormalizer::PexprPullUpProjections
(
IMemoryPool *pmp,
CExpression *pexpr
)
{
GPOS_ASSERT(NULL != pexpr);
BOOL fPullUp = true;
pexpr->AddRef();
CExpression *pexprOutput = pexpr;
while (fPullUp)
{
fPullUp = false;
CExpression *pexprOutputNew = PexprPullUpAndCombineProjects(pmp, pexprOutput, &fPullUp);
pexprOutput->Release();
pexprOutput = pexprOutputNew;
}
GPOS_ASSERT(FLocalColsSubsetOfInputCols(pmp, pexprOutput));
return pexprOutput;
}
示例11:
//---------------------------------------------------------------------------
// @function:
// CStatsPredUtils::Pdrgpstatsjoin
//
// @doc:
// Helper function to extract array of statistics join filter from
// an expression
//---------------------------------------------------------------------------
DrgPstatsjoin *
CStatsPredUtils::Pdrgpstatsjoin
(
IMemoryPool *pmp,
CExpressionHandle &exprhdl,
CExpression *pexprScalarInput,
DrgPcrs *pdrgpcrsOutput, // array of output columns of join's relational inputs
CColRefSet *pcrsOuterRefs
)
{
GPOS_ASSERT(NULL != pdrgpcrsOutput);
// remove implied predicates from join condition to avoid cardinality under-estimation
CExpression *pexprScalar = CPredicateUtils::PexprRemoveImpliedConjuncts(pmp, pexprScalarInput, exprhdl);
// extract all the conjuncts
CStatsPred *pstatspredUnsupported = NULL;
DrgPstatsjoin *pdrgpstatsjoin = PdrgpstatsjoinExtract
(
pmp,
pexprScalar,
pdrgpcrsOutput,
pcrsOuterRefs,
&pstatspredUnsupported
);
// TODO: May 15 2014, handle unsupported predicates for LASJ, LOJ and LS joins
// clean up
CRefCount::SafeRelease(pstatspredUnsupported);
pexprScalar->Release();
return pdrgpstatsjoin;
}
示例12: if
//---------------------------------------------------------------------------
// @function:
// CStatsPredUtils::PdrgpstatsjoinExtract
//
// @doc:
// Helper function to extract array of statistics join filter
// from an array of join predicates
//
//---------------------------------------------------------------------------
DrgPstatsjoin *
CStatsPredUtils::PdrgpstatsjoinExtract
(
IMemoryPool *pmp,
CExpression *pexprScalar,
DrgPcrs *pdrgpcrsOutput, // array of output columns of join's relational inputs
CColRefSet *pcrsOuterRefs,
CStatsPred **ppstatspredUnsupported
)
{
GPOS_ASSERT(NULL != pexprScalar);
GPOS_ASSERT(NULL != pdrgpcrsOutput);
DrgPstatsjoin *pdrgpstatsjoin = GPOS_NEW(pmp) DrgPstatsjoin(pmp);
DrgPexpr *pdrgpexprUnsupported = GPOS_NEW(pmp) DrgPexpr(pmp);
// extract all the conjuncts
DrgPexpr *pdrgpexprConjuncts = CPredicateUtils::PdrgpexprConjuncts(pmp, pexprScalar);
const ULONG ulSize = pdrgpexprConjuncts->UlLength();
for (ULONG ul = 0; ul < ulSize; ul++)
{
CExpression *pexprPred = (*pdrgpexprConjuncts) [ul];
CStatisticsJoin *pstatsjoin = PstatsjoinExtract
(
pmp,
pexprPred,
pdrgpcrsOutput,
pcrsOuterRefs,
pdrgpexprUnsupported
);
if (NULL != pstatsjoin)
{
pdrgpstatsjoin->Append(pstatsjoin);
}
}
const ULONG ulUnsupported = pdrgpexprUnsupported->UlLength();
if (1 == ulUnsupported)
{
*ppstatspredUnsupported = CStatsPredUtils::PstatspredExtract(pmp, (*pdrgpexprUnsupported)[0], pcrsOuterRefs);
}
else if (1 < ulUnsupported)
{
pdrgpexprUnsupported->AddRef();
CExpression *pexprConj = CPredicateUtils::PexprConjDisj(pmp, pdrgpexprUnsupported, true /* fConjunction */);
*ppstatspredUnsupported = CStatsPredUtils::PstatspredExtract(pmp, pexprConj, pcrsOuterRefs);
pexprConj->Release();
}
// clean up
pdrgpexprUnsupported->Release();
pdrgpexprConjuncts->Release();
return pdrgpstatsjoin;
}
示例13: CColRefSet
//---------------------------------------------------------------------------
// @function:
// CDecorrelator::FProcessGbAgg
//
// @doc:
// Decorrelate GbAgg operator
//
//---------------------------------------------------------------------------
BOOL
CDecorrelator::FProcessGbAgg
(
IMemoryPool *pmp,
CExpression *pexpr,
BOOL, // fEqualityOnly
CExpression **ppexprDecorrelated,
DrgPexpr *pdrgpexprCorrelations
)
{
CLogicalGbAgg *popAggOriginal = CLogicalGbAgg::PopConvert(pexpr->Pop());
// fail if agg has outer references
if (CUtils::FHasOuterRefs(pexpr) && !CUtils::FHasOuterRefs((*pexpr)[0]))
{
return false;
}
// TODO: 12/20/2012 - ; check for strictness of agg function
// decorrelate relational child
CExpression *pexprRelational = NULL;
if (!FProcess(pmp, (*pexpr)[0], true /*fEqualityOnly*/, &pexprRelational, pdrgpexprCorrelations))
{
GPOS_ASSERT(NULL == pexprRelational);
return false;
}
// get the output columns of decorrelated child
CColRefSet *pcrsOutput = CDrvdPropRelational::Pdprel(pexprRelational->PdpDerive())->PcrsOutput();
// create temp expression of correlations to determine inner columns
pdrgpexprCorrelations->AddRef();
CExpression *pexprTemp = CPredicateUtils::PexprConjunction(pmp, pdrgpexprCorrelations);
CColRefSet *pcrs =
GPOS_NEW(pmp) CColRefSet(pmp,
*(CDrvdPropScalar::Pdpscalar(pexprTemp->PdpDerive())->PcrsUsed()));
pcrs->Intersection(pcrsOutput);
pexprTemp->Release();
// add grouping columns from original agg
pcrs->Include(popAggOriginal->Pdrgpcr());
// assemble grouping columns
DrgPcr *pdrgpcr = pcrs->Pdrgpcr(pmp);
pcrs->Release();
// assemble agg
CExpression *pexprProjList = (*pexpr)[1];
pexprProjList->AddRef();
CLogicalGbAgg *popAgg = GPOS_NEW(pmp) CLogicalGbAgg(pmp, pdrgpcr, popAggOriginal->Egbaggtype());
*ppexprDecorrelated = GPOS_NEW(pmp) CExpression(pmp, popAgg, pexprRelational, pexprProjList);
return true;
}
示例14:
//---------------------------------------------------------------------------
// @function:
// CLogicalSelect::PstatsDerive
//
// @doc:
// Derive statistics based on filter predicates
//
//---------------------------------------------------------------------------
IStatistics *
CLogicalSelect::PstatsDerive
(
IMemoryPool *pmp,
CExpressionHandle &exprhdl,
DrgPstat *pdrgpstatCtxt
)
const
{
GPOS_ASSERT(Esp(exprhdl) > EspNone);
IStatistics *pstatsChild = exprhdl.Pstats(0);
if (exprhdl.Pdpscalar(1 /*ulChildIndex*/)->FHasSubquery())
{
// in case of subquery in select predicate, we return child stats
pstatsChild->AddRef();
return pstatsChild;
}
// remove implied predicates from selection condition to avoid cardinality under-estimation
CExpression *pexprScalar = exprhdl.PexprScalarChild(1 /*ulChildIndex*/);
CExpression *pexprPredicate = CPredicateUtils::PexprRemoveImpliedConjuncts(pmp, pexprScalar, exprhdl);
// split selection predicate into local predicate and predicate involving outer references
CExpression *pexprLocal = NULL;
CExpression *pexprOuterRefs = NULL;
// get outer references from expression handle
CColRefSet *pcrsOuter = exprhdl.Pdprel()->PcrsOuter();
CPredicateUtils::SeparateOuterRefs(pmp, pexprPredicate, pcrsOuter, &pexprLocal, &pexprOuterRefs);
pexprPredicate->Release();
IStatistics *pstats = CStatisticsUtils::PstatsFilter(pmp, exprhdl, pstatsChild, pexprLocal, pexprOuterRefs, pdrgpstatCtxt);
pexprLocal->Release();
pexprOuterRefs->Release();
return pstats;
}
示例15: DrgPcrs
//---------------------------------------------------------------------------
// @function:
// CLogicalDifferenceAll::PstatsDerive
//
// @doc:
// Derive statistics
//
//---------------------------------------------------------------------------
IStatistics *
CLogicalDifferenceAll::PstatsDerive
(
IMemoryPool *pmp,
CExpressionHandle &exprhdl,
DrgPstat * // not used
)
const
{
GPOS_ASSERT(Esp(exprhdl) > EspNone);
// difference all is transformed into a LASJ,
// we follow the same route to compute statistics
DrgPcrs *pdrgpcrsOutput = GPOS_NEW(pmp) DrgPcrs(pmp);
const ULONG ulSize = m_pdrgpdrgpcrInput->UlLength();
for (ULONG ul = 0; ul < ulSize; ul++)
{
CColRefSet *pcrs = GPOS_NEW(pmp) CColRefSet(pmp, (*m_pdrgpdrgpcrInput)[ul]);
pdrgpcrsOutput->Append(pcrs);
}
IStatistics *pstatsOuter = exprhdl.Pstats(0);
IStatistics *pstatsInner = exprhdl.Pstats(1);
// construct the scalar condition for the LASJ
CExpression *pexprScCond = CUtils::PexprConjINDFCond(pmp, m_pdrgpdrgpcrInput);
// compute the statistics for LASJ
CColRefSet *pcrsOuterRefs = exprhdl.Pdprel()->PcrsOuter();
DrgPstatsjoin *pdrgpstatsjoin = CStatsPredUtils::Pdrgpstatsjoin
(
pmp,
exprhdl,
pexprScCond,
pdrgpcrsOutput,
pcrsOuterRefs
);
IStatistics *pstatsLASJ = pstatsOuter->PstatsLASJoin
(
pmp,
pstatsInner,
pdrgpstatsjoin,
true /* fIgnoreLasjHistComputation*/
);
// clean up
pexprScCond->Release();
pdrgpstatsjoin->Release();
pdrgpcrsOutput->Release();
return pstatsLASJ;
}