//--------------------------------------------------------------------------- // @function: // CXformSubqJoin2Apply::Exfp // // @doc: // Compute xform promise for a given expression handle; // if subqueries exist in the scalar predicate, we must have an // equivalent logical Apply expression created during exploration; // no need for generating a Join expression here // //--------------------------------------------------------------------------- CXform::EXformPromise CXformSubqJoin2Apply::Exfp ( CExpressionHandle &exprhdl ) const { if (exprhdl.GetDrvdScalarProps(exprhdl.Arity() - 1)->FHasSubquery()) { return CXform::ExfpHigh; } return CXform::ExfpNone; }
//--------------------------------------------------------------------------- // @function: // CPhysical::FUnaryUsesDefinedColumns // // @doc: // Return true if the given column set includes any of the columns defined // by the unary node, as given by the handle // //--------------------------------------------------------------------------- BOOL CPhysical::FUnaryUsesDefinedColumns ( CColRefSet *pcrs, CExpressionHandle &exprhdl ) { GPOS_ASSERT(NULL != pcrs); GPOS_ASSERT(2 == exprhdl.Arity() && "Not a unary operator"); if (0 == pcrs->Size()) { return false; } return !pcrs->IsDisjoint(exprhdl.GetDrvdScalarProps(1)->PcrsDefined()); }
//--------------------------------------------------------------------------- // @function: // CXformGbAggWithMDQA2Join::Exfp // // @doc: // Compute xform promise for a given expression handle; // //--------------------------------------------------------------------------- CXform::EXformPromise CXformGbAggWithMDQA2Join::Exfp ( CExpressionHandle &exprhdl ) const { CAutoMemoryPool amp; CLogicalGbAgg *popAgg = CLogicalGbAgg::PopConvert(exprhdl.Pop()); if (COperator::EgbaggtypeGlobal == popAgg->Egbaggtype() && exprhdl.GetDrvdScalarProps(1 /*child_index*/)->FHasMultipleDistinctAggs()) { 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; }