//--------------------------------------------------------------------------- // @function: // CPhysicalPartitionSelectorDML::EpetDistribution // // @doc: // Return the enforcing type for distribution property based on this operator // //--------------------------------------------------------------------------- CEnfdProp::EPropEnforcingType CPhysicalPartitionSelectorDML::EpetDistribution ( CExpressionHandle &exprhdl, const CEnfdDistribution *ped ) const { GPOS_ASSERT(NULL != ped); // get distribution delivered by the filter node CDistributionSpec *pds = CDrvdPropPlan::Pdpplan(exprhdl.Pdp())->Pds(); if (ped->FCompatible(pds)) { // required distribution is already provided return CEnfdProp::EpetUnnecessary; } if (exprhdl.HasOuterRefs()) { return CEnfdProp::EpetProhibited; } return CEnfdProp::EpetRequired; }
//--------------------------------------------------------------------------- // @function: // CXformLeftAntiSemiApplyNotIn2LeftAntiSemiJoinNotInNoCorrelations::Exfp // // @doc: // Compute xform promise for a given expression handle; // outer references are not allowed // //--------------------------------------------------------------------------- CXform::EXformPromise CXformLeftAntiSemiApplyNotIn2LeftAntiSemiJoinNotInNoCorrelations::Exfp ( CExpressionHandle &exprhdl ) const { // if there are no outer references, or if all outer refs do not reference outer // child, the transformation is applicable if (!exprhdl.HasOuterRefs(1 /*child_index*/) || CUtils::FInnerUsesExternalColsOnly(exprhdl)) { return CXform::ExfpHigh; } return CXform::ExfpNone; }
//--------------------------------------------------------------------------- // @function: // CXformLeftOuterApply2LeftOuterJoin::Exfp // // @doc: // Compute xform promise for a given expression handle; // outer references are not allowed // //--------------------------------------------------------------------------- CXform::EXformPromise CXformLeftOuterApply2LeftOuterJoin::Exfp ( CExpressionHandle &exprhdl ) const { // if there are outer refs that include columns from the immediate outer child, the // transformation is applicable if (exprhdl.HasOuterRefs(1 /*child_index*/) && !CUtils::FInnerUsesExternalColsOnly(exprhdl)) { return CXform::ExfpHigh; } return CXform::ExfpNone; }
//--------------------------------------------------------------------------- // @function: // CXformLeftSemiJoin2InnerJoin::Exfp // // @doc: // Compute xform promise for a given expression handle; // //--------------------------------------------------------------------------- CXform::EXformPromise CXformLeftSemiJoin2InnerJoin::Exfp ( CExpressionHandle &exprhdl ) const { if (exprhdl.HasOuterRefs() || exprhdl.GetDrvdScalarProps(2)->FHasSubquery()) { return ExfpNone; } CColRefSet *pcrsInnerOutput = exprhdl.GetRelationalProperties(1 /*child_index*/)->PcrsOutput(); CExpression *pexprScalar = exprhdl.PexprScalarChild(2 /*child_index*/); CAutoMemoryPool amp; // examine join predicate to determine xform applicability if (!CPredicateUtils::FSimpleEqualityUsingCols(amp.Pmp(), pexprScalar, pcrsInnerOutput)) { return ExfpNone; } return ExfpHigh; }