本文整理汇总了C++中CExpression::AddRef方法的典型用法代码示例。如果您正苦于以下问题:C++ CExpression::AddRef方法的具体用法?C++ CExpression::AddRef怎么用?C++ CExpression::AddRef使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CExpression
的用法示例。
在下文中一共展示了CExpression::AddRef方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1:
//---------------------------------------------------------------------------
// @function:
// CXformJoinCommutativity::Transform
//
// @doc:
// Actual transformation
//
//---------------------------------------------------------------------------
void
CXformJoinCommutativity::Transform
(
CXformContext *pxfctxt,
CXformResult *pxfres,
CExpression *pexpr
) const
{
GPOS_ASSERT(NULL != pxfctxt);
GPOS_ASSERT(FPromising(pxfctxt->Pmp(), this, pexpr));
GPOS_ASSERT(FCheckPattern(pexpr));
IMemoryPool *pmp = pxfctxt->Pmp();
// extract components
CExpression *pexprLeft = (*pexpr)[0];
CExpression *pexprRight = (*pexpr)[1];
CExpression *pexprScalar = (*pexpr)[2];
// addref children
pexprLeft->AddRef();
pexprRight->AddRef();
pexprScalar->AddRef();
// assemble transformed expression
CExpression *pexprAlt =
CUtils::PexprLogicalJoin<CLogicalInnerJoin>(pmp, pexprRight, pexprLeft, pexprScalar);
// add alternative to transformation result
pxfres->Add(pexprAlt);
}
示例2: CName
//---------------------------------------------------------------------------
// @function:
// CXformImplementDynamicBitmapTableGet::Transform
//
// @doc:
// Actual transformation
//
//---------------------------------------------------------------------------
void
CXformImplementDynamicBitmapTableGet::Transform
(
CXformContext *pxfctxt,
CXformResult *pxfres,
CExpression *pexpr
)
const
{
GPOS_ASSERT(NULL != pxfctxt);
GPOS_ASSERT(FPromising(pxfctxt->Pmp(), this, pexpr));
GPOS_ASSERT(FCheckPattern(pexpr));
IMemoryPool *pmp = pxfctxt->Pmp();
CLogicalDynamicBitmapTableGet *popLogical = CLogicalDynamicBitmapTableGet::PopConvert(pexpr->Pop());
CTableDescriptor *ptabdesc = popLogical->Ptabdesc();
ptabdesc->AddRef();
CName *pname = GPOS_NEW(pmp) CName(pmp, popLogical->Name());
DrgPcr *pdrgpcrOutput = popLogical->PdrgpcrOutput();
GPOS_ASSERT(NULL != pdrgpcrOutput);
pdrgpcrOutput->AddRef();
DrgDrgPcr *pdrgpdrgpcrPart = popLogical->PdrgpdrgpcrPart();
pdrgpdrgpcrPart->AddRef();
CPartConstraint *ppartcnstr = popLogical->Ppartcnstr();
ppartcnstr->AddRef();
CPartConstraint *ppartcnstrRel = popLogical->PpartcnstrRel();
ppartcnstrRel->AddRef();
CPhysicalDynamicBitmapTableScan *popPhysical =
GPOS_NEW(pmp) CPhysicalDynamicBitmapTableScan
(
pmp,
popLogical->FPartial(),
ptabdesc,
pexpr->Pop()->UlOpId(),
pname,
popLogical->UlScanId(),
pdrgpcrOutput,
pdrgpdrgpcrPart,
popLogical->UlSecondaryScanId(),
ppartcnstr,
ppartcnstrRel
);
CExpression *pexprCondition = (*pexpr)[0];
CExpression *pexprIndexPath = (*pexpr)[1];
pexprCondition->AddRef();
pexprIndexPath->AddRef();
CExpression *pexprPhysical =
GPOS_NEW(pmp) CExpression(pmp, popPhysical, pexprCondition, pexprIndexPath);
pxfres->Add(pexprPhysical);
}
示例3: CColRefSet
//---------------------------------------------------------------------------
// @function:
// CXformCollapseGbAgg::Transform
//
// @doc:
// Actual transformation to collapse two cascaded group by operators;
// if the top Gb grouping columns are subset of bottom Gb grouping
// columns AND both Gb operators do not define agg functions, we can
// remove the bottom group by operator
//
//
//---------------------------------------------------------------------------
void
CXformCollapseGbAgg::Transform
(
CXformContext *pxfctxt,
CXformResult *pxfres,
CExpression *pexpr
)
const
{
GPOS_ASSERT(NULL != pxfctxt);
GPOS_ASSERT(NULL != pxfres);
GPOS_ASSERT(FPromising(pxfctxt->Pmp(), this, pexpr));
GPOS_ASSERT(FCheckPattern(pexpr));
IMemoryPool *pmp = pxfctxt->Pmp();
// extract components
CLogicalGbAgg *popTopGbAgg = CLogicalGbAgg::PopConvert(pexpr->Pop());
GPOS_ASSERT(0 < popTopGbAgg->Pdrgpcr()->UlLength());
GPOS_ASSERT(popTopGbAgg->FGlobal());
CExpression *pexprRelational = (*pexpr)[0];
CExpression *pexprTopProjectList = (*pexpr)[1];
CLogicalGbAgg *popBottomGbAgg = CLogicalGbAgg::PopConvert(pexprRelational->Pop());
CExpression *pexprChild = (*pexprRelational)[0];
CExpression *pexprBottomProjectList = (*pexprRelational)[1];
if (!popBottomGbAgg->FGlobal())
{
// bottom GbAgg must be global to prevent xform from getting applied to splitted GbAggs
return;
}
if (0 < pexprTopProjectList->UlArity() || 0 < pexprBottomProjectList->UlArity())
{
// exit if any of the Gb operators has an aggregate function
return;
}
#ifdef GPOS_DEBUG
// for two cascaded GbAgg ops with no agg functions, top grouping
// columns must be a subset of bottom grouping columns
CColRefSet *pcrsTopGrpCols = GPOS_NEW(pmp) CColRefSet(pmp, popTopGbAgg->Pdrgpcr());
CColRefSet *pcrsBottomGrpCols = GPOS_NEW(pmp) CColRefSet(pmp, popBottomGbAgg->Pdrgpcr());
GPOS_ASSERT(pcrsBottomGrpCols->FSubset(pcrsTopGrpCols));
pcrsTopGrpCols->Release();
pcrsBottomGrpCols->Release();
#endif // GPOS_DEBUG
pexprChild->AddRef();
CExpression *pexprSelect = CUtils::PexprLogicalSelect(pmp, pexprChild, CPredicateUtils::PexprConjunction(pmp, NULL /*pdrgpexpr*/));
popTopGbAgg->AddRef();
pexprTopProjectList->AddRef();
CExpression *pexprGbAggNew = GPOS_NEW(pmp) CExpression(pmp, popTopGbAgg, pexprSelect, pexprTopProjectList);
pxfres->Add(pexprGbAggNew);
}
示例4: if
//---------------------------------------------------------------------------
// @function:
// CPartitionPropagationSpec::PexprFilter
//
// @doc:
// Return the filter expression for the given Scan Id
//
//---------------------------------------------------------------------------
CExpression *
CPartitionPropagationSpec::PexprFilter
(
IMemoryPool *mp,
ULONG scan_id
)
{
CExpression *pexprScalar = m_ppfm->Pexpr(scan_id);
GPOS_ASSERT(NULL != pexprScalar);
if (CUtils::FScalarIdent(pexprScalar))
{
// condition of the form "pkey": translate into pkey = true
pexprScalar->AddRef();
pexprScalar = CUtils::PexprScalarEqCmp(mp, pexprScalar, CUtils::PexprScalarConstBool(mp, true /*value*/, false /*is_null*/));
}
else if (CPredicateUtils::FNot(pexprScalar) && CUtils::FScalarIdent((*pexprScalar)[0]))
{
// condition of the form "!pkey": translate into pkey = false
CExpression *pexprId = (*pexprScalar)[0];
pexprId->AddRef();
pexprScalar = CUtils::PexprScalarEqCmp(mp, pexprId, CUtils::PexprScalarConstBool(mp, false /*value*/, false /*is_null*/));
}
else
{
pexprScalar->AddRef();
}
return pexprScalar;
}
示例5: PexprLookup
//---------------------------------------------------------------------------
// @function:
// CJoinOrderDP::PexprJoin
//
// @doc:
// Join expressions in the given two sets
//
//---------------------------------------------------------------------------
CExpression *
CJoinOrderDP::PexprJoin
(
CBitSet *pbsFst,
CBitSet *pbsSnd
)
{
GPOS_ASSERT(NULL != pbsFst);
GPOS_ASSERT(NULL != pbsSnd);
CExpression *pexprFst = PexprLookup(pbsFst);
GPOS_ASSERT(NULL != pexprFst);
CExpression *pexprSnd = PexprLookup(pbsSnd);
GPOS_ASSERT(NULL != pexprSnd);
CExpression *pexprScalar = PexprPred(pbsFst, pbsSnd);
GPOS_ASSERT(NULL != pexprScalar);
pexprFst->AddRef();
pexprSnd->AddRef();
pexprScalar->AddRef();
return CUtils::PexprLogicalJoin<CLogicalInnerJoin>(m_mp, pexprFst, pexprSnd, pexprScalar);
}
示例6: GPOS_NEW
//---------------------------------------------------------------------------
// @function:
// CStatsPredUtils::PstatspredLikeHandleCasting
//
// @doc:
// Create a LIKE statistics filter
//---------------------------------------------------------------------------
CStatsPred *
CStatsPredUtils::PstatspredLike
(
IMemoryPool *pmp,
CExpression *pexprPred,
CColRefSet *//pcrsOuterRefs,
)
{
GPOS_ASSERT(NULL != pexprPred);
GPOS_ASSERT(CPredicateUtils::FLikePredicate(pexprPred));
CExpression *pexprLeft = (*pexprPred)[0];
CExpression *pexprRight = (*pexprPred)[1];
// we support LIKE predicate of the following patterns
// CAST(ScIdent) LIKE Const
// CAST(ScIdent) LIKE CAST(Const)
// ScIdent LIKE Const
// ScIdent LIKE CAST(Const)
// CAST(Const) LIKE ScIdent
// CAST(Const) LIKE CAST(ScIdent)
// const LIKE ScIdent
// const LIKE CAST(ScIdent)
CExpression *pexprScIdent = NULL;
CExpression *pexprScConst = NULL;
CPredicateUtils::ExtractLikePredComponents(pexprPred, &pexprScIdent, &pexprScConst);
if (NULL == pexprScIdent || NULL == pexprScConst)
{
return GPOS_NEW(pmp) CStatsPredUnsupported(ULONG_MAX, CStatsPred::EstatscmptLike);
}
CScalarIdent *popScalarIdent = CScalarIdent::PopConvert(pexprScIdent->Pop());
ULONG ulColId = popScalarIdent->Pcr()->UlId();
CScalarConst *popScalarConst = CScalarConst::PopConvert(pexprScConst->Pop());
IDatum *pdatumLiteral = popScalarConst->Pdatum();
const CColRef *pcr = popScalarIdent->Pcr();
if (!IMDType::FStatsComparable(pcr->Pmdtype(), pdatumLiteral))
{
// unsupported stats comparison between the column and datum
return GPOS_NEW(pmp) CStatsPredUnsupported(pcr->UlId(), CStatsPred::EstatscmptLike);
}
CDouble dDefaultScaleFactor(1.0);
if (pdatumLiteral->FSupportLikePredicate())
{
dDefaultScaleFactor = pdatumLiteral->DLikePredicateScaleFactor();
}
pexprLeft->AddRef();
pexprRight->AddRef();
return GPOS_NEW(pmp) CStatsPredLike(ulColId, pexprLeft, pexprRight, dDefaultScaleFactor);
}
示例7: CColRefSet
//---------------------------------------------------------------------------
// @function:
// CXformLeftSemiJoin2InnerJoin::Transform
//
// @doc:
// actual transformation
//
//---------------------------------------------------------------------------
void
CXformLeftSemiJoin2InnerJoin::Transform
(
CXformContext *pxfctxt,
CXformResult *pxfres,
CExpression *pexpr
)
const
{
GPOS_ASSERT(NULL != pxfctxt);
GPOS_ASSERT(FPromising(pxfctxt->Pmp(), this, pexpr));
GPOS_ASSERT(FCheckPattern(pexpr));
IMemoryPool *mp = pxfctxt->Pmp();
// extract components
CExpression *pexprOuter = (*pexpr)[0];
CExpression *pexprInner = (*pexpr)[1];
CExpression *pexprScalar = (*pexpr)[2];
pexprOuter->AddRef();
pexprInner->AddRef();
pexprScalar->AddRef();
// construct grouping columns by collecting used columns in the join predicate
// that come from join's inner child
CColRefSet *pcrsOuterOutput = CDrvdPropRelational::GetRelationalProperties(pexprOuter->PdpDerive())->PcrsOutput();
CColRefSet *pcrsUsed = CDrvdPropScalar::GetDrvdScalarProps(pexprScalar->PdpDerive())->PcrsUsed();
CColRefSet *pcrsGb = GPOS_NEW(mp) CColRefSet(mp);
pcrsGb->Include(pcrsUsed);
pcrsGb->Difference(pcrsOuterOutput);
GPOS_ASSERT(0 < pcrsGb->Size());
CKeyCollection *pkc = CDrvdPropRelational::GetRelationalProperties(pexprInner->PdpDerive())->Pkc();
if (NULL == pkc ||
(NULL != pkc && !pkc->FKey(pcrsGb, false /*fExactMatch*/)))
{
// grouping columns do not cover a key on the inner side,
// we need to create a group by on inner side
CColRefArray *colref_array = pcrsGb->Pdrgpcr(mp);
CExpression *pexprGb =
GPOS_NEW(mp) CExpression
(
mp,
GPOS_NEW(mp) CLogicalGbAgg(mp, colref_array, COperator::EgbaggtypeGlobal /*egbaggtype*/),
pexprInner,
GPOS_NEW(mp) CExpression(mp, GPOS_NEW(mp) CScalarProjectList(mp))
);
pexprInner = pexprGb;
}
CExpression *pexprInnerJoin =
CUtils::PexprLogicalJoin<CLogicalInnerJoin>(mp, pexprOuter, pexprInner, pexprScalar);
pcrsGb->Release();
pxfres->Add(pexprInnerJoin);
}
示例8:
//---------------------------------------------------------------------------
// @function:
// CXformGbAgg2StreamAgg::Transform
//
// @doc:
// Actual transformation
//
//---------------------------------------------------------------------------
void
CXformGbAgg2StreamAgg::Transform
(
CXformContext *pxfctxt,
CXformResult *pxfres,
CExpression *pexpr
)
const
{
GPOS_ASSERT(NULL != pxfctxt);
GPOS_ASSERT(FPromising(pxfctxt->Pmp(), this, pexpr));
GPOS_ASSERT(FCheckPattern(pexpr));
CLogicalGbAgg *popAgg = CLogicalGbAgg::PopConvert(pexpr->Pop());
IMemoryPool *pmp = pxfctxt->Pmp();
DrgPcr *pdrgpcr = popAgg->Pdrgpcr();
pdrgpcr->AddRef();
// extract components
CExpression *pexprRel = (*pexpr)[0];
CExpression *pexprScalar = (*pexpr)[1];
// addref children
pexprRel->AddRef();
pexprScalar->AddRef();
DrgPcr *pdrgpcrArgDQA = popAgg->PdrgpcrArgDQA();
if (0 != pdrgpcrArgDQA->UlSafeLength())
{
GPOS_ASSERT(NULL != pdrgpcrArgDQA);
pdrgpcrArgDQA->AddRef();
}
// create alternative expression
CExpression *pexprAlt =
GPOS_NEW(pmp) CExpression
(
pmp,
GPOS_NEW(pmp) CPhysicalStreamAgg
(
pmp,
pdrgpcr,
popAgg->PdrgpcrMinimal(),
popAgg->Egbaggtype(),
popAgg->FGeneratesDuplicates(),
pdrgpcrArgDQA,
CXformUtils::FMultiStageAgg(pexpr)
),
pexprRel,
pexprScalar
);
// add alternative to transformation result
pxfres->Add(pexprAlt);
}
示例9:
//---------------------------------------------------------------------------
// @function:
// CXformGbAggDedup2HashAggDedup::Transform
//
// @doc:
// Actual transformation
//
//---------------------------------------------------------------------------
void
CXformGbAggDedup2HashAggDedup::Transform
(
CXformContext *pxfctxt,
CXformResult *pxfres,
CExpression *pexpr
)
const
{
GPOS_ASSERT(NULL != pxfctxt);
GPOS_ASSERT(FPromising(pxfctxt->Pmp(), this, pexpr));
GPOS_ASSERT(FCheckPattern(pexpr));
IMemoryPool *pmp = pxfctxt->Pmp();
CLogicalGbAggDeduplicate *popAggDedup = CLogicalGbAggDeduplicate::PopConvert(pexpr->Pop());
DrgPcr *pdrgpcr = popAggDedup->Pdrgpcr();
pdrgpcr->AddRef();
DrgPcr *pdrgpcrKeys = popAggDedup->PdrgpcrKeys();
pdrgpcrKeys->AddRef();
// extract components
CExpression *pexprRel = (*pexpr)[0];
CExpression *pexprScalar = (*pexpr)[1];
GPOS_ASSERT(0 == pexprScalar->UlArity());
// addref children
pexprRel->AddRef();
pexprScalar->AddRef();
// create alternative expression
CExpression *pexprAlt =
GPOS_NEW(pmp) CExpression
(
pmp,
GPOS_NEW(pmp) CPhysicalHashAggDeduplicate
(
pmp,
pdrgpcr,
popAggDedup->PdrgpcrMinimal(),
popAggDedup->Egbaggtype(),
pdrgpcrKeys,
popAggDedup->FGeneratesDuplicates(),
CXformUtils::FMultiStageAgg(pexpr)
),
pexprRel,
pexprScalar
);
// add alternative to transformation result
pxfres->Add(pexprAlt);
}
示例10: CLogicalInnerJoin
//---------------------------------------------------------------------------
// @function:
// CNormalizer::FSimplifySelectOnOuterJoin
//
// @doc:
// A SELECT on top of LOJ, where SELECT's predicate is NULL-filtering and
// uses columns from LOJ's inner child, is simplified as Inner-Join
//
// Example:
//
// select * from (select * from R left join S on r1=s1) as foo where foo.s1>0;
//
// is converted to:
//
// select * from R inner join S on r1=s1 and s1>0;
//
//
//
//---------------------------------------------------------------------------
BOOL
CNormalizer::FSimplifySelectOnOuterJoin
(
IMemoryPool *pmp,
CExpression *pexprOuterJoin,
CExpression *pexprPred, // selection predicate
CExpression **ppexprResult
)
{
GPOS_ASSERT(NULL != pmp);
GPOS_ASSERT(COperator::EopLogicalLeftOuterJoin == pexprOuterJoin->Pop()->Eopid());
GPOS_ASSERT(pexprPred->Pop()->FScalar());
GPOS_ASSERT(NULL != ppexprResult);
if (0 == pexprOuterJoin->UlArity())
{
// exit early for leaf patterns extracted from memo
*ppexprResult = NULL;
return false;
}
CExpression *pexprOuterJoinOuterChild = (*pexprOuterJoin)[0];
CExpression *pexprOuterJoinInnerChild = (*pexprOuterJoin)[1];
CExpression *pexprOuterJoinPred = (*pexprOuterJoin)[2];
CColRefSet *pcrsOutput = CDrvdPropRelational::Pdprel(pexprOuterJoinInnerChild->PdpDerive())->PcrsOutput();
if (!GPOS_FTRACE(EopttraceDisableOuterJoin2InnerJoinRewrite) &&
CPredicateUtils::FNullRejecting(pmp, pexprPred, pcrsOutput))
{
// we have a predicate on top of LOJ that uses LOJ's inner child,
// if the predicate filters-out nulls, we can add it to the join
// predicate and turn LOJ into Inner-Join
pexprOuterJoinOuterChild->AddRef();
pexprOuterJoinInnerChild->AddRef();
*ppexprResult = GPOS_NEW(pmp) CExpression
(
pmp,
GPOS_NEW(pmp) CLogicalInnerJoin(pmp),
pexprOuterJoinOuterChild,
pexprOuterJoinInnerChild,
CPredicateUtils::PexprConjunction(pmp, pexprPred, pexprOuterJoinPred)
);
return true;
}
// failed to convert LOJ to inner-join
return false;
}
示例11:
//---------------------------------------------------------------------------
// @function:
// CXformImplementLimit::Transform
//
// @doc:
// Actual transformation
//
//---------------------------------------------------------------------------
void
CXformImplementLimit::Transform
(
CXformContext *pxfctxt,
CXformResult *pxfres,
CExpression *pexpr
)
const
{
GPOS_ASSERT(NULL != pxfctxt);
GPOS_ASSERT(FPromising(pxfctxt->Pmp(), this, pexpr));
GPOS_ASSERT(FCheckPattern(pexpr));
IMemoryPool *pmp = pxfctxt->Pmp();
// extract components
CLogicalLimit *popLimit = CLogicalLimit::PopConvert(pexpr->Pop());
CExpression *pexprRelational = (*pexpr)[0];
CExpression *pexprScalarStart = (*pexpr)[1];
CExpression *pexprScalarRows = (*pexpr)[2];
COrderSpec *pos = popLimit->Pos();
// addref all components
pexprRelational->AddRef();
pexprScalarStart->AddRef();
pexprScalarRows->AddRef();
popLimit->Pos()->AddRef();
// assemble physical operator
CExpression *pexprLimit =
GPOS_NEW(pmp) CExpression
(
pmp,
GPOS_NEW(pmp) CPhysicalLimit
(
pmp,
pos,
popLimit->FGlobal(),
popLimit->FHasCount(),
popLimit->FTopLimitUnderDML()
),
pexprRelational,
pexprScalarStart,
pexprScalarRows
);
// add alternative to results
pxfres->Add(pexprLimit);
}
示例12: CBitSet
//---------------------------------------------------------------------------
// @function:
// CJoinOrderDP::PexprExpand
//
// @doc:
// Create join order
//
//---------------------------------------------------------------------------
CExpression *
CJoinOrderDP::PexprExpand()
{
CBitSet *pbs = GPOS_NEW(m_pmp) CBitSet(m_pmp);
for (ULONG ul = 0; ul < m_ulComps; ul++)
{
(void) pbs->FExchangeSet(ul);
}
if (GPOPT_DP_JOIN_ORDERING_SIZE_THRESHOLD < m_ulComps &&
GPOPT_DP_JOIN_ORDERING_CONNECTEDNESS_THRESHOLD < DMaxConnectedness(pbs))
{
// terminate early if computation cost is expected to be large
pbs->Release();
return NULL;
}
CExpression *pexprResult = PexprBestJoinOrder(pbs);
if (NULL != pexprResult)
{
pexprResult->AddRef();
}
pbs->Release();
return pexprResult;
}
示例13: 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;
}
示例14:
//---------------------------------------------------------------------------
// @function:
// CNormalizer::SplitConjunct
//
// @doc:
// Split the given conjunct into pushable and unpushable predicates
//
//
//---------------------------------------------------------------------------
void
CNormalizer::SplitConjunct
(
IMemoryPool *pmp,
CExpression *pexpr,
CExpression *pexprConj,
DrgPexpr **ppdrgpexprPushable,
DrgPexpr **ppdrgpexprUnpushable
)
{
GPOS_ASSERT(pexpr->Pop()->FLogical());
GPOS_ASSERT(pexprConj->Pop()->FScalar());
GPOS_ASSERT(NULL != ppdrgpexprPushable);
GPOS_ASSERT(NULL != ppdrgpexprUnpushable);
// collect pushable predicates from given conjunct
*ppdrgpexprPushable = GPOS_NEW(pmp) DrgPexpr(pmp);
*ppdrgpexprUnpushable = GPOS_NEW(pmp) DrgPexpr(pmp);
DrgPexpr *pdrgpexprConjuncts = CPredicateUtils::PdrgpexprConjuncts(pmp, pexprConj);
const ULONG ulSize = pdrgpexprConjuncts->UlLength();
for (ULONG ul = 0; ul < ulSize; ul++)
{
CExpression *pexprScalar = (*pdrgpexprConjuncts)[ul];
pexprScalar->AddRef();
if (FPushable(pexpr, pexprScalar))
{
(*ppdrgpexprPushable)->Append(pexprScalar);
}
else
{
(*ppdrgpexprUnpushable)->Append(pexprScalar);
}
}
pdrgpexprConjuncts->Release();
}
示例15: PexprConjunction
//---------------------------------------------------------------------------
// @function:
// CConstraint::PexprScalarConjDisj
//
// @doc:
// Construct a conjunction or disjunction scalar expression from an
// array of constraints
//
//---------------------------------------------------------------------------
CExpression *
CConstraint::PexprScalarConjDisj
(
IMemoryPool *pmp,
DrgPcnstr *pdrgpcnstr,
BOOL fConj
)
const
{
DrgPexpr *pdrgpexpr = GPOS_NEW(pmp) DrgPexpr(pmp);
const ULONG ulLen = pdrgpcnstr->UlLength();
for (ULONG ul = 0; ul < ulLen; ul++)
{
CExpression *pexpr = (*pdrgpcnstr)[ul]->PexprScalar(pmp);
pexpr->AddRef();
pdrgpexpr->Append(pexpr);
}
if (fConj)
{
return CPredicateUtils::PexprConjunction(pmp, pdrgpexpr);
}
return CPredicateUtils::PexprDisjunction(pmp, pdrgpexpr);
}